3 回答

TA貢獻1850條經驗 獲得超11個贊
您無法將此定義為默認值,因為在定義任何實例之前定義方法時會計算默認值。通常的模式是做這樣的事情:
class C: def __init__(self, format): self.format = format def process(self, formatting=None): if formatting is None: formatting = self.format print(formatting)
self.format
如果將只用于formatting
為None
。
要演示默認值的工作方式,請參閱此示例:
def mk_default(): print("mk_default has been called!")def myfun(foo=mk_default()): print("myfun has been called.")print("about to test functions")myfun("testing")myfun("testing again")
這里的輸出:
mk_default has been called!about to test functions myfun has been called.myfun has been called.
注意如何mk_default
只調用一次,這發生在函數被調用之前!

TA貢獻1816條經驗 獲得超4個贊
在Python中,名字self
是不是特別的。它只是參數名稱的約定,這就是為什么有一個self
參數__init__
。(實際上,__init__
也不是很特別,特別是它實際上并沒有創建對象......這是一個更長的故事)
C("abc").process()
創建一個C
實例,process
在C
類中查找方法,并以C
實例作為第一個參數調用該方法。因此,self
如果您提供參數,它將最終出現在參數中。
但是,即使您擁有該參數,也不會允許您編寫類似的內容def process(self, formatting = self.formatting)
,因為self
在您設置默認值時尚未在范圍內。在Python中,參數的默認值是在編譯函數時計算的,并且“卡在”函數中。(這就是為什么,如果您使用默認值[]
,該列表將記住對函數的調用之間的更改。)
我怎么能做這個工作?
傳統方法是None
默認使用,并檢查該值并在函數內替換它。您可能會發現為此目的創建一個特殊值(一個object
實例就是您所需要的,只要您隱藏它以便調用代碼不使用相同的實例)而不是None
。無論哪種方式,你應該檢查這個值is
,而不是==
。
添加回答
舉報