为了将各种类的方法放入全局注册表中,我使用了带有元类的装饰器。装饰器标签,元类将函数放入注册表:
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
我现在已经到了需要两个函数注册表的地步。第一个想法是对元类进行子类化并将另一个注册表放入其中。为此,只需重写新方法即可。
由于重写意味着冗余代码,这不是我真正想要的。因此,如果有人能说出一种如何将属性放入元类中的方法,该方法可以在执行new时读取,那就太好了。这样就可以放入正确的注册表,而无需重写新的.