我正在使用@classmethod
編寫一個具有多個構造函數的類。現在,我希望__init__
構造函數以及類方法構造函數在執行其他任務之前調用該類的一些例程以設置初始值。python中的多元構造函數調用相同的例程
從__init__
這通常是用自做:
def __init__(self, name="", revision=None):
self._init_attributes()
def _init_attributes(self):
self.test = "hello"
從類方法構造,我會調用另一個類方法來代替,因爲不創建實例(即self
),直到我離開類方法與return cls(...)
。現在,我可以打電話給我_init_attributes()
方法
@classmethod
def from_file(cls, filename=None)
cls._init_attributes()
# do other stuff like reading from file
return cls()
,這實際工作(在我沒有得到一個錯誤的感覺,我的確可以看到執行c = Class.from_file()
後的測試屬性。但是,如果我沒有理解的東西如果我使用可變對象(例如列表)初始化屬性,那麼此類的所有實例將使用相同的列表,而不是這是正確的嗎?如果是這樣,是否有方法來初始化classmethods中的「實例」屬性,還是必須以這樣的方式編寫代碼:所有的屬性初始化都在init?
嗯。實際上,在寫這篇文章的時候:我甚至可能比我想象的更麻煩,因爲init將會從classmethod返回時調用,不是嗎?那麼處理這種情況的適當方法是什麼?
注:文章[1]討論了一個有點類似的問題。
相反,你不能只是'_init_attributes()'@ staticmethod'並顯式傳遞它的屬性需要初始化的對象嗎? – martineau