Class 装饰器不是每次都被调用
Class decorator not being called everytime
一件看似简单的事情,我却绕不过去
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'>
现在我希望装饰器被调用 3
times.Why 它只被调用了吗 once
.
class 装饰器在 创建 class 时应用 ,而不是在每次创建实例时应用。
@register
行仅适用于 class Foo(object):
语句。这是 运行 仅 一次 ,当模块被导入时。
创建实例不需要重新运行 class 语句,因为实例只是保持对 class 的引用的对象(type(c)
returns Foo
class 对象);实例不是 class 对象的 'copies'。
如果你想注册实例,你要么必须在__init__
或[=33=的__new__
方法中这样做] (也可以装饰)。 __new__
负责创建实例,__init__
是用来初始化该实例的钩子。
class 装饰器被应用到 class 本身,并且只在定义 class 时应用一次。基本上,它处理 class 定义并生成一个新的 class.
所以你只需要处理一次。
一件看似简单的事情,我却绕不过去
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'>
现在我希望装饰器被调用 3
times.Why 它只被调用了吗 once
.
class 装饰器在 创建 class 时应用 ,而不是在每次创建实例时应用。
@register
行仅适用于 class Foo(object):
语句。这是 运行 仅 一次 ,当模块被导入时。
创建实例不需要重新运行 class 语句,因为实例只是保持对 class 的引用的对象(type(c)
returns Foo
class 对象);实例不是 class 对象的 'copies'。
如果你想注册实例,你要么必须在__init__
或[=33=的__new__
方法中这样做] (也可以装饰)。 __new__
负责创建实例,__init__
是用来初始化该实例的钩子。
class 装饰器被应用到 class 本身,并且只在定义 class 时应用一次。基本上,它处理 class 定义并生成一个新的 class.
所以你只需要处理一次。