2011-03-02 102 views
23

我想了解Python中構造函數__init__的參數。Python中的__init__和參數

class Num: 
    def __init__(self,num): 
     self.n = num 
    def getn(self): 
     return self.n 
    def getone(): 
     return 1 
myObj = Num(3) 

print myObj.getn() 

結果:3

我稱之爲getone()方法:

print myObj.getone() 

RESULT:錯誤 'getone()' 不帶參數(1given)。

所以我代替:

def getone(): 
    return 1 

def getone(self): 
    return 1 

結果:1這是可行的。

getone()方法不需要參數。

我必須使用毫無意義的論據嗎?

+6

它們不是毫無意義的。每個類的方法總是有一個隱含的參數,即實例。在C++中它是一樣的,但你永遠不會在參數列表中看到它,因爲它神奇地出現在仙女森林的灌木叢中。Python是'顯式優於隱式'的。 – 2011-03-02 15:01:02

+1

你可以使用@staticmethod和@classmethod裝飾器來做你想做的事。請參閱我的答案中的示例。 – stderr 2011-03-02 15:13:11

回答

31

Python實例方法需要自我參數。類方法將類作爲第一個參數。靜態方法不需要實例(self)或類(cls)參數。

__init__是一個特殊功能,並且不會覆蓋__new__它總是會被賦予類的實例作爲它的第一個參數。

使用內置類方法和靜態方法裝飾的一個例子:

import sys 

class Num: 
    max = sys.maxint 

    def __init__(self,num): 
     self.n = num 

    def getn(self): 
     return self.n 

    @staticmethod 
    def getone(): 
     return 1 

    @classmethod 
    def getmax(cls): 
     return cls.max 

myObj = Num(3) 
# with the appropriate decorator these should work fine 
myObj.getone() 
myObj.getmax() 
myObj.getn() 

這就是說,我會嘗試使用@classmethod/@staticmethod謹慎。如果您發現自己創建的對象只包含staticmethod,那麼更多的pythonic將會創建一個相關函數的新模塊。

3

在Python必須經過至少一個參數類方法,參數爲self,這是沒有意義的,以該實例本身

4

,你的方法不使用的事實參考self參數(這是對該方法所附的實例的引用)並不意味着您可以將其忽略。它總是在那裏,因爲Python總是試圖通過它。

2

當前對象作爲第一個參數顯式傳遞給方法。 self是傳統名稱。你可以任意調用它,但強烈建議你堅持這個約定以避免混淆。