在上篇博客的在線編程中需要實例化對象,然後調用類中定義的方法,這其中遇到點小問題,就是當去掉方法的第一個參數self後,直接調用方法(不使用實例對象調用,直接Find(4,array)),然後報錯:missing 1 required positional argument: 'self'
由於之前對這一塊沒有過深地研究,只知道self是默認的參數,傳參是不用管它,之前最多用在__init__方法中,現在稍微研究一下,看看這裏邊有什麼奧祕,上代碼:
# # -*- coding:utf-8 -*-
class Test:
def instance(self):
return "這是實例方法"
@classmethod
def classM(cls):
return "這是類方法"
@staticmethod
def static():
return "這是一個和類無關的方法"
t=Test() #實例化對象
print(t.instance())
print(t.classM())
print(t.static())
如上所示,在類Test中定義了三個方法,第一個爲實例方法,參數爲self;第二個爲類方法,參數爲cls;第三個爲靜態方法,沒有參數,後兩者都使用了裝飾器,感興趣的朋友可以搜一下這一塊,之後有時間我也會探究一下。
之後分別用實例對象t調用這三個方法並輸出:
沒毛病,正常輸出,接着註釋掉上邊的代碼,改用類名直接調用:
print(Test.classM())
print(Test.static())
print(Test.instance())
報錯了:
報的錯和我之前遇到的一樣,其實這一點和java中很類似,類名不能直接調用實例方法,因爲當類初始化時還沒有實例對象,大概就是這麼個意思,總結一下:
實例方法
定義:第一個參數必須是實例對象,該參數名一般約定爲“self”,通過它來傳遞實例的屬性和方法(也可以傳類的屬性和方法);
調用:只能由實例對象調用。
類方法
定義:使用裝飾器@classmethod。第一個參數必須是當前類對象,該參數名一般約定爲“cls”,通過它來傳遞類的屬性和方法(不能傳實例的屬性和方法);
調用:實例對象和類對象都可以調用。
靜態方法
定義:使用裝飾器@staticmethod。參數隨意,沒有“self”和“cls”參數,但是方法體中不能使用類或實例的任何屬性和方法;
調用:實例對象和類對象都可以調用。