Python:打破大班级的最佳方式

时间:2015-02-05 18:43:26

标签: python

我有一个非常大的类,它充当许多AdapterClasses的BaseClass。基类由可以分类如下的方法组成:

  • 翻译:所有AdapterClasses使用的基本翻译类方法。需要来自AdapterClasses的类属性(使用内部/外部)这个的棘手部分是我想从AdapterClasses维护类级别访问,但是我没理由。现在我可以直接从AdapterClasses获得instace级别的访问权限和来自Translator的类级别访问。
  • 操作:所有AdapterClasses(内部)使用的基本方法
  • 适配器方法:AdapterClasses可以覆盖的方法,以满足特殊需求。 (内部)
  • api方法:仅在外部使用,但需要访问所有内部方法(外部)

我认为分离如下将使开发变得更容易,并使公众api更清晰。在我接受这个重新考虑之前,我想要一些反馈。欢迎思考,评论和建议..

这是我正在做的非常简化的抽象,甚至不接近我的实际代码。我只是想传达结构。

一个问题:请参阅有关to_adapter的类级访问权限的注释。我想访问DislexiaAadpter.tr.to_adapter()但由于它是Translator中的类属性,因此您无法同时使用多个适配器。当译者方法是BaseClass的一部分时,这不是问题。

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)

用法:

# Translator 
print Translator.by_lang('hello world', 'spanish')
hola mundo
print Translator.by_lang('hola mundo', 'english')
hello world

# AdapterClass
d = DislexiaClass()
print d.get_slogan()
dislexia's slogan is: sdrawkcab tsuj m'i
d.translate(slogan)
dislexia's slogan is: i'm just backwards 

# WrapperClass
w = WrapperClass()
wd = w.dislexia
print wd.yas('hello world')
dlrow olleh
print wd.yas('hola mundo')
dlrow olleh
print wd.c.translate(wd.yas('hola mundo'))
hello world

0 个答案:

没有答案