每次都没有调用类装饰器

时间:2016-10-20 13:43:00

标签: python python-2.7 decorator python-decorators

一个看似简单的事我无法解决。

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

2 个答案:

答案 0 :(得分:3)

在创建类时应用类装饰器,而不是每次创建实例时都应用

@register行仅适用于class Foo(object):语句。 一次,在导入模块时运行。

创建实例不需要重新运行类语句,因为实例只是保持对类的引用的对象(type(c)返回Foo类对象);实例不是类对象的“副本”。

如果要注册实例,您必须在类的__init____new__方法中进行注册(也可以进行修饰)。 __new__负责创建实例,__init__是被调用以初始化该实例的钩子。

答案 1 :(得分:2)

类装饰器正在应用于类本身,并且在定义类时仅应用一次。基本上,它处理类定义并生成一个新类。

所以你只需要处理一次。