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.

所以你只需要处理一次。