我成功地创建装饰任何类型的类一个装饰,增加了标准的接口,所有这些,为方便,集成等...装饰一堂课 - 装饰一次忘了吧?
我一直在使用元类的抵制,因为文学在这一点上说,这是一个矫枉过正的问题,大多数时候都可以被类装饰器所替代。我遇到的困难是:
def Decorator(somearg):
def wrapper(cls):
clsinit = cls.__init__
cls.members = []
def __init__(self, *args, **kwargs):
#do something with somearg...
self.__class__.members.append(self)
clsinit(self,*args,**kwargs)
cls.__init__ = clsinit
return cls
return wrapper
@Decorator('thearg')
class A(object):
pass
a = A()
b = A()
使用python调试器,在导入时,类A立即用参数'thearg'装饰。但是每次我实例化A()时,实例都直接调用装饰器中定义的init,而不通过先前的层。这很好,因为我希望我的课程记录每个成员,并且不会在每次新实例实例化时都重置。但我不确定我明白为什么。
有人可以解释在这种特定情况下的python解释器的物理?
您发布的代码有问题。它有一个SyntaxError,可能会触发'somearg'和'cls'的角色。它是你的真实代码的简化版本吗?请测试并修复。 – unutbu 2013-02-09 03:46:12
我修复了代码 – 2013-02-09 09:25:08
这实际上就是应该使用元类的东西。没有明确装饰每个子类,修饰器就无法处理它。 – 2013-02-09 19:17:46