2016-10-20 93 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

類裝飾器正在被應用於類本身,並且在類定義時它只應用一次。基本上,它處理類定義併產生一個新類。

所以你只能處理一次。