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

arc*_*lix 7 python

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

  • 翻译:所有AdapterClasses使用的基本翻译类方法.需要来自AdapterClasses的类属性(使用内部/外部)这个的棘手部分是我想从AdapterClasses维护类级别访问,但是我没理由.现在我从AdapterClasses进行实例级访问,直接从Translator获得类级访问.
  • 操作:所有AdapterClasses使用的基本方法(内部)
  • adapter方法: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)
Run Code Online (Sandbox Code Playgroud)

用法:

# 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
Run Code Online (Sandbox Code Playgroud)