2011-10-28 92 views
1

是否有任何方法只有一次調用init()方法。或者當我從一個類創建一個對象時,如何禁用init()的調用?Python調用__init __()方法只有一次

+0

你的意思是你想要一個單身? –

+5

'__init__'將始終在對象構造時調用。這就是它的目的。如果你試圖讓它只被調用一次,那麼你的邏輯可能有一個缺陷。如果你發佈你正在努力實現的目標,我們可能會幫助你想出更正確的解決方案 –

+0

當你創建一個類的實例時,__init__'的目的就是觸發。更具體地說明你要在這裏做什麼。 – Will

回答

7

如果你想有一個,那裏是永遠只能一個類的實例,那麼你可以創建一個裝飾像下面從PEP18得到:

def singleton(cls): 
    instances = {} 
    def getinstance(): 
     if cls not in instances: 
      instances[cls] = cls() 
     return instances[cls] 
    return getinstance 

@singleton 
class MyClass: 
    pass 

試試看:

>>> a = MyClass() 
>>> b = MyClass() 
>>> a == b 
True 
0

init方法將始終被調用,但您可以創建另一個稱爲run()的方法或其他方法,您可以在創建對象後調用該方法。

foo = ClassName() 
foo.run() # replacement for __init__ 

foo2 = ClassName() 
2

有禁用__init__沒有直接的方法,但也有一些方法來解決這個問題。其中之一是有一個標誌:

class Class: 
    _init_already = False 
    __init__(self): 
     if not Class._init_already: 
      ... 
      Class._init_already = True 

但是,這是醜陋的。你真的想完成什麼?

1

你不應該把任何東西放在你只想運行一次的__init__()。每次創建一個類__init__()的實例都會運行。

如果你想自定義你的課程的創建,你應該考慮創建一個metaclass。基本上,這可以讓你定義一個函數,該類只在第一次定義類時才運行一次。

相關問題