2011-10-26 69 views
2
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中成員函數的默認值

回答

0

你是對的,你不能這樣做。

例如,在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" 
0

時的默認值進行評估時發生錯誤。這種情況發生在類被定義的時候(而不是當方法被調用時)。在那個時候,self沒有意義。解決這個問題

一種方式是像這樣:

... 
    def foo2(self,aa=None): 
     if aa is None: 
      aa = self.A 
     return "la" 
    ... 
4

關鍵字參數,如aa,不能採取從self默認值。當方法是定義爲時,關鍵字參數會被評估,而不是在調用時。通常人們會實現你想要什麼設置的aaNone默認:

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]