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,而不是==。
添加回答
舉報
