2011-08-01 49 views
4

下面的代碼是如何實施與元類單身,和它運作良好實現單與元類

class Test_MetaClass(type): 

    def __init__(cls, name, bases, dict): 
     super(Test_MetaClass, cls).__init__(cls, bases, dict) 
     cls._instance = None 
     print 'Test_MetaClass __init__' 

    def __call__(cls, *args, **kwargs): 
     if cls._instance is None: 
      cls._instance = super(Test_MetaClass, cls).__call__(*args, **kwargs) 
     print 'Test_MetaClass __call__' 
     return cls._instance 


class A(object): 
    __metaclass__ = Test_MetaClass 
    def __init__(self): 
     print 'A __init__ triggered' 

a = A() 
b = A() 

輸出:

Test_MetaClass __init__ 
A __init__ triggered 
Test_MetaClass __call__ 
Test_MetaClass __call__ 

我的問題是,爲什麼b = A()直奔Test_MetaClass.__call__而忽略__init__

+0

您的元類可能更簡單。不是一個答案,所以你必須處理評論格式。 (class): cls._instance = None;如果cls._instance是無: cls._instance = super(Singleton,cls).__ call __(* args,** kwargs); return cls._instance;' – agf

回答

2

這不是你想要的嗎? cls._instance不是None,所以它不會執行type.__call__(cls, *args, **kwargs)

>>> type.__call__(A) 
A __init__ triggered 
<__main__.A object at 0x00BADB30> 

正是通過這種調用A.__new__A.__init__被調用創建/初始化一個新的實例。但對於你的單身你只需要一個實例。

+0

是的,你的權利,我沒有注意到'__init__'是通過'__call__'觸發的 – limboy

相關問題