一些背景:我们有一个交易系统,我们根据交易账单的国家划分流程。我们有一个存在于 2 个实例中的日志记录表,一个 DB 将事务记录到欧盟,另一个记录到其他任何地方。我们还有一个测试库,用于管理和隐藏使用数据库的内容,粗略地说,每个表都由一个类表示。我有一个代表表的类,而 db 会话管理器类对于该类的两个实例中的每一个都有两个成员。我想要做的是创建一个通用的'meta dao'类,它将对其进行任意调用,检查参数,并根据输入参数之一,随后将调用分派给正确的代表数据库实例的类实例。我最初考虑只是重载每个方法,但那
我正在考虑使用__getattr__
来覆盖方法查找,以便我可以根据接收到的方法的名称调用正确的实例__getattr__
,但据我了解,我不能从 insideinspect
传入方法参数__getattr__
,所以我可以在这种情况下,不能从它内部正确调度。有没有人对我可以追求的不同方向有任何想法,或者有一种从内部“检查”参数的方法,而不仅仅是方法名称__getattr__
?
[编辑]这是我正在谈论的通用版本:
class BarBase(object):
def __init__(self, x):
self.x = x
def do_bar(self, i):
return self.x * i
class FooBar(BarBase):
def __init__(self, x):
super(FooBar, self).__init__(x)
def do_foo(self, i):
return self.x + i
class MetaFoo(object):
def __init__(self, bar_manager):
self.foo_manager = bar_manager
#something here that will take an arbitrary methodname and args as
#long as args includes a value named i, inspect i, and call
#bar_manager.fooa.[methodname](args) if i < 10,
#and bar_manager.foob.[methodname](args) if i >= 10
class BarManager(object):
def __init__(self):
self.bar_list = {}
def __get_fooa(self):
if 'fooa' not in self.bar_list.keys():
self.bar_list['fooa'] = FooBar('a')
return self.bar_list['fooa']
fooa = property(__get_fooa)
def __get_foob(self):
if 'foob' not in self.bar_list.keys():
self.bar_list['foob'] = FooBar('b')
return self.bar_list['foob']
foob = property(__get_foob)
def __get_foo(self):
if 'foo' not in self.bar_list.keys():
self.bar_list['foo'] = MetaFoo(self)
return self.bar_list['foo']