さまざまなクラスのメソッドをグローバルレジストリに配置するために、メタクラスを持つデコレータを使用しています。デコレータタグ、メタクラスは関数をレジストリに配置します。
class ExposedMethod (object):
def __init__(self, decoratedFunction):
self._decoratedFunction = decoratedFunction
def __call__(__self,*__args,**__kw):
return __self._decoratedFunction(*__args,**__kw)
class ExposedMethodDecoratorMetaclass(type):
def __new__(mcs, name, bases, dct):
for obj_name, obj in dct.iteritems():
if isinstance(obj, ExposedMethod):
WorkerFunctionRegistry.addWorkerToWorkerFunction(obj_name, name)
return type.__new__(mcs, name, bases, dct)
class MyClass (object):
__metaclass__ = DiscoveryExposedMethodDecoratorMetaclass
@ExposeDiscoveryMethod
def myCoolExposedMethod (self):
pass
これで、2つの関数レジストリが必要になるようになりました。最初に考えたのは、メタクラスをサブクラス化し、他のレジストリを配置することでした。そのためには、新しいメソッドを単に書き直す必要があります。
書き換えは冗長なコードを意味するので、これは私が本当に望んでいることではありません。したがって、 newが実行されたときに読み取ることができるメタクラス内に属性を配置する方法を誰かが指定できると便利です。これにより、新しいを書き直すことなく、適切なレジストリを配置できます。