背景: トランザクションの請求先の国に基づいてフローを分割するトランザクションのシステムがあります。2 つのインスタンスに存在するロギング テーブルがあります。1 つの DB は EU にトランザクションを記録し、もう 1 つは他の場所にトランザクションを記録します。大まかに言えば、各テーブルがクラスによって表される DB を操作する根性を管理および非表示にするテスト ライブラリもあります。テーブルを表すクラスがあり、db セッション マネージャー クラスには、クラスの 2 つのインスタンスのそれぞれに対して 2 つのメンバーがあります。私がやりたいことは、任意の呼び出しを受け取り、引数を検査し、入力引数の 1 つに基づいて、呼び出しを正しい db インスタンスを表すクラス インスタンスにディスパッチする汎用の「メタ ダオ」クラスを作成することです。最初はすべてのメソッドをオーバーロードすることだけを考えていましたが、それは'
__getattr__
メソッドルックアップをオーバーライドして、受信したメソッドの名前に基づいて正しいインスタンスを呼び出すことができるようにすることを検討していまし__getattr__
たが、私が理解していることinspect
から、内から着信メソッド引数を取得できない__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']