我有一个非常大的类,它充当许多AdapterClasses的BaseClass。基类由可以分类如下的方法组成:
我认为分离如下将使开发变得更容易,并使公众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