一个看似简单的事我无法解决。
registry = {}
def register(cls):
registry[cls.__clsid__] = cls
print cls
return cls
@register
class Foo(object):
__clsid__ = "123-456"
def bar(self):
pass
c=Foo()
d=Foo()
e=Foo()
输出:
<class '__main__.Foo'>
现在我希望decorator被调用3
次。为什么它只被调用once
。
答案 0 :(得分:3)
在创建类时应用类装饰器,而不是每次创建实例时都应用。
@register
行仅适用于class Foo(object):
语句。 一次,在导入模块时运行。
创建实例不需要重新运行类语句,因为实例只是保持对类的引用的对象(type(c)
返回Foo
类对象);实例不是类对象的“副本”。
如果要注册实例,您必须在类的__init__
或__new__
方法中进行注册(也可以进行修饰)。 __new__
负责创建实例,__init__
是被调用以初始化该实例的钩子。
答案 1 :(得分:2)
类装饰器正在应用于类本身,并且在定义类时仅应用一次。基本上,它处理类定义并生成一个新类。
所以你只需要处理一次。