2016-10-20 12 views
0

看似简单的事情,我不能解决。班级装饰师不会每次都被调用

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调用。

+0

那么你想在这里实现什么?一个类对象只创建一次;你没有创建更多的类,你正在创建*实例*。那些'Foo()'调用不会重新执行'class'语句。 –

回答

2

当类创建时,类装饰器被应用,而不是每次创建实例时。

@register行仅适用于class Foo(object):声明。当模块被导入时,这只运行一次

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

如果你想注册实例你要么必须在__init__或一类的__new__方法(也得以饰)这样做。 __new__负责创建实例,__init__是调用来初始化该实例的钩子。

+0

但是'class'只是创建'object'时创建的模板 – vks

+1

@vks:不,类是一个对象。调用该对象然后生成一个实例,该实例保持对该类的引用。例如,通过该参考属性得到解决,这就是如何找到方法。 –

+0

嘿http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python我们有单个装饰器的类......它只允许一个对象......如果装饰器只被调用一次,那么如何它是否管理这个? – vks

2

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

所以你只能处理一次。