我有一个非常大的类,它作为许多适配器类的基类。基类包含可按如下分类的方法:
我认为下面的分离可以使开发更容易,并使公共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}$
目前没有回答
相关问题 更多 >
编程相关推荐