2014-01-30 19 views
0

我想在這個python類中創建一個默認值。但是,當我嘗試做這件事時,我得到一個錯誤,說「我自己沒有定義」如何在Python中的類中包含默認參數?

我知道答案是簡單的,但它目前還沒有。任何人都知道我爲什麼不能在這裏添加一個默認參數?

在此先感謝您的答覆!

class Sort(object): 
    def __init__(self, lst): 
     self.lst = lst 

    def halve(self, l = self.lst):### this line <-------------- 
     n1 = l[:len(l)/2] 
     n2 = l[len(l) /2:] 
     return (n1,n2) 
+0

參數不能在參數列表中使用,它們在參數列表中定義。 – user2864740

回答

3

不幸的是,你需要指定一個None默認並檢查它是否是在

class Sort(object): 
    def __init__(self, lst): 
     self.lst = lst 

    def halve(self, l=None): 
     if l is None: l = self.lst 
     n1 = l[:len(l)/2] 
     n2 = l[len(l) /2:] 
     return (n1,n2) 

的參數被傳遞到方法中一個函數在創建函數時建立,而不是在函數被調用時建立,因此self.lst尚不存在。

而且,看到"Principle of Least Astonishment"

+0

不創建類(也就是自身。 lst)在創建該方法之前出現?這就是我不清楚的。 – JonnyTruelove

+0

首先創建* class *,但創建* instance *(以及擴展名self)並不會 – mhlester

+0

提供另一個更簡單的方法,當定義halve時,__init__還沒有運行 – mhlester

3

一種更好的方式去了解這一點,也許會是:

def halve(self,l=None): 
    if l is None: 
     l = self.lst 
    # code 

順便說一句:請不要命名變量l EL或O OH或I眼睛。它們看起來像某些字體中的1和0,讓每個人都變得更加困難。如果您想表示它是一個通用列表,請使用lst,就像您的類變量一樣!更好的是,用它表示的名稱命名:這是一個等級列表嗎? grade_list。這是一個數字清單嗎? numbers。即使它只是input_list它至少比lst更具可讀性和更具可讀性比l

+0

它有點兒有趣,但它最初是第一個。我認爲它可能會混淆人們,因爲它已經在構造函數中使用過(是__init__方法被認爲是構造函數嗎?) – JonnyTruelove

+0

(是,'__init__'方法被稱爲構造函數) –

1

既然是方法的參數之一,self只會裏面Sort.halve定義,而不是在聲明該行。這意味着您不能訪問self.lst,直到您進入該方法。

作爲一種變通方法,你可以做這樣的事情:

def halve(self, l=None): 
    if l is None: 
     l = self.lst 
    n1 = l[:len(l)/2] 
    n2 = l[len(l) /2:] 
    return (n1,n2) 

上面的代碼分配的Sort.halveNone默認值l參數。當方法被調用時,它將使用if語句來查看調用者是否爲它提供了一個參數。如果是這樣,它將保持l等於。否則,它將分配lself.lst

0

即使它似乎並不爲你的目的是有用的,你能避免使用None作爲默認佔位符,你可以使用*args收集所有參數在一個列表:

def halve(self, *args): 
    if not args: # if arg is an empty list/no arguments given 
     lst = self.lst 
    else: 
     lst = args[0] 
    # code 

或在一行:

def halve(self, *args): 
    lst = self.lst if not args else args[0] 
    # code 
0

其他人已經展示了你如何處理你的問題,但我想清楚你的代碼不工作的原因。

試想一下,你的代碼:

def foo(obj, y = obj.x): 
    pass 

這不會爲同樣的原因,以下是行不通的工作:

def foo(x, y = x+2): 
    pass 

的關鍵在於你的困惑,我想,對於「自我」這個名字沒有什麼特別之處。很容易認爲「自我」是指對象的關鍵詞(比如像紅寶石),但事實並非如此。在Python中,對象的方法會自動將對象作爲第一個參數傳遞,而將它稱爲第一個參數「self」恰好是傳統的。

如果你有一個類,對象,方法調用,比如:

class A(object): 
    def foo(self, x, y): 
     pass 
a = A() 
a.foo(1, 2) 

基本上可以認爲這個方法調用隱式調用的:

a.foo(a, 1, 2) 

這還不是最謹慎它的方式,但我認爲這使得這個想法足夠清晰。