为了将各种类的方法放入全局注册表中,我使用了一个带有元类的装饰器。装饰器标签,元类将函数放入注册表中:python:子类的子类
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
我现在已经到了需要两个函数注册表的地步。第一个想法是对元类进行子类化,并将其他注册表放入其中。为此,只需重写该方法即可。
由于重写意味着多余的代码,这不是我真正想要的。所以,如果有人能够说出如何将元素放在元类内部,那么当新的被执行时能够被读取,这将是很好的。有了这个正确的注册表可以放入,而不必重写新的。
哇,这帮助了很多。但是,我从不希望将一个班的职能暴露给不同的登记处。我认为你和鲁珀的回答相结合的方式将符合我的需求。 而且,为了记录,我完全意识到这些方法是常规实例而不是静态方法:-)。我需要此注册表的原因是为了验证客户端请求的这种功能。如果函数在注册表中,则创建该实例并调用该方法。 – 2010-05-01 17:37:32