class foo():
def __init__(self,a):
self.A=a
def foo2(self,aa=self.A):
return "la"
@classmethod
def test(cls):
d=foo()
d.foo2()
成員函數foo2找不到self.A也不是A.是否因爲A在類中沒有全局設置?python中成員函數的默認值
class foo():
def __init__(self,a):
self.A=a
def foo2(self,aa=self.A):
return "la"
@classmethod
def test(cls):
d=foo()
d.foo2()
成員函數foo2找不到self.A也不是A.是否因爲A在類中沒有全局設置?python中成員函數的默認值
你是對的,你不能這樣做。
例如,在Python中,你必須非常小心這一點,因爲它會使用相同的列表一遍又一遍(在這種情況下,它會繼續追加到相同的列表):
def foo2(self,aa=[]):
aa.append('foo')
return "la"
相反,一個很常見的方法是分配None
爲默認值,然後有一個if語句來設置它裏面的函數:
def foo2(self,aa=None):
if not aa:
aa = self.A
return "la"
時的默認值進行評估時發生錯誤。這種情況發生在類被定義的時候(而不是當方法被調用時)。在那個時候,self
沒有意義。解決這個問題
一種方式是像這樣:
...
def foo2(self,aa=None):
if aa is None:
aa = self.A
return "la"
...
關鍵字參數,如aa
,不能採取從self
默認值。當方法是定義爲時,關鍵字參數會被評估,而不是在調用時。通常人們會實現你想要什麼設置的aa
到None
默認:
class foo():
def __init__(self, a):
self.A = a
def foo2(self, aa=None):
if aa is None:
aa = self.A
return 'la'
還要注意的是,由於關鍵字參數的默認值是在定義評估,不執行,的foo2
所有調用分享他們的默認參數即使從foo
的不同實例調用。這與方法,如工作時經常絆倒了新的Python程序員:
def footoo(a=list()):
a.append(1)
return a
所有調用footoo將得到相同列表對象;每次通話都不是新的。所以重複調用footoo
會導致以下結果:
>>> footoo()
[1]
>>> footoo()
[1, 1]
>>> footoo()
[1, 1, 1]