Python:分解大型类的最佳方法

2024-06-06 23:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常大的类,它作为许多适配器类的基类。基类包含可按如下分类的方法:

  • 翻译:所有适配器类使用的基本翻译类方法。需要来自adapterClass的类属性(使用内部/外部的),对于这个问题,棘手的部分是我想维护来自adapterclass的类级访问,但是我没有做到。现在我有了来自adapterClass的instace级访问和Translator直接的类级访问。在
  • 操作:所有适配器类使用的基本方法(内部)
  • 适配器方法:根据特殊需要,可以由适配器类覆盖的方法。(内部)
  • api方法:仅在外部使用,但需要访问所有内部方法(外部)

我认为下面的分离可以使开发更容易,并使公共api更清晰。在我进行这种再分解之前,我想得到一些反馈。欢迎提出意见、意见、建议。。在

这是对我正在做的事情的一个极其简化的抽象,甚至与我的实际代码不太接近。我只是想把这个结构传达出去。在

一个问题:请参阅注释以获取对\u适配器的类级访问权限。我想访问DislexiaAadpter.tr.to_adapter(),但由于它是Translator中的一个类属性,所以不能同时使用多个适配器。当转换器方法是基类的一部分时,这不是问题。在

class Translator(object):
    ac = None
    dictionaries = {'english_spanish':{'hello world':'hola mundo', "i'm just backwards":'Solo soy al reves'}}
    def __init__(self, c):
        self.ac = c


    def to_adapter(self, phrase):
        r = self.by_lang(phrase, self.ac.lang)
        return r

    @classmethod
    def by_lang(cls, phrase, lang=None):
        d = cls.get_dictionary(lang)
        if isinstance(d, dict):
            for k, v in d.items(): 
                if phrase in k:
                    return v
            return phrase
        else:
            return d

    @classmethod
    def get_dictionary(cls, lang='english'):
        for k, v in cls.dictionaries.items():
            if lang in k:
                k = k.split('_')
                if lang == k[0]:
                    return {v:k for k,v in v.items()}
                else:
                    return v
        return "We don't know that language."


class BaseApi(object):

    def __init__(self, c):
        self.c = c

    def say(self, phrase):
        return self.c.translate(phrase)


class BaseClass(object):
    tr = Translator
    api = BaseApi
    lang = 'english'
    id = 'baseclass'
    slogan = 'base slogan'

    def __init__(self):
        self.tr = Translator(self)
        self.api = self.api(self)

    # operations methods
    def split(self, string):
        l = string.split(':')
        prefix = l[0]
        try:
            phrase = l[1]
        except:
            phrase = prefix
            prefix = ''
        return (phrase, prefix)

    def process_translate(self, phrase, prefix):
        return prefix+': '+phrase if prefix else phrase

    # adapter methods
    def translate(self, phrase):
        phrase, prefix = self.split(phrase)
        phrase = self.tr.to_adapter(phrase)
        return (phrase, prefix)

    def get_slogan(self):
        slogan = self.slogan#self.translate(self.slogan)
        return self.id+"'s slogan is: "+slogan

# AdapterClass
class DislexiaApi(BaseApi):

    def yas(self, phrase):
        hdys = super(DislexiaApi, self).say(phrase)   
        return hdys

class DislexiaClass(BaseClass):
    id = "dislexia"
    lang = 'english'
    slogan = "sdrawkcab tsuj m'i"
    api= DislexiaApi

    def make_dislexic(self, string):
        return string[::-1]

    def translate(self, phrase):
        phrase, prefix = super(DislexiaClass, self).translate(phrase)
        phrase = self.make_dislexic(phrase)
        return self.process_translate(phrase, prefix)


# Wrapper class returns the api of all Adapters. Nice and clean.
class WrapperClass():
    adapters = [DislexiaClass]
    def __init__(self):
        for adapter in self.adapters:
            setattr(self, adapter.id, adapter().api)

用法:

^{pr2}$

Tags: 方法inselfapilangprefixadapterreturn