Python類中的各種方法是通過方法的名字調用的函數,通過定義類和對象,將類和對象當做參數傳入方法中,進而獲得返回值
Python類中的方法是對象與函數的結合體
以下是python類中對對象的初始化函數以及三種方法的定義
class Test(object):
def __init__(self, title): #可定義多個參數
self.title = title
def get_title(self): #定義了實例方法
return self.title
@classmethod
def get_time(cls): #定義了類方法
print("On July 2")
@staticmethod
def get_grade(): #定義了靜態方法
print("89")
在定義一個類的對象時,需要用到 __init__,self爲默認命名的參數(可以爲其他的字符串)實際爲對象的地址,可以理解爲保險箱中存放着很多東西,self爲保險箱的編號,可以方便的找到自己的保險箱
instance method(需要添加參數“self”)
實例方法的兩種調用格式
MS.get_title(); #通過實例調用
Test.get_title(MS) #通過類的方式調用
In [11]: MS = Test('Molecular system examination')
In [12]: MS.get_title()
Out[12]: 'Molecular system examination'
當我們調用方法get_title時,get_title方法實際是將調用的實例對象MS作爲參數self傳遞了進去,self是參數的名稱,不是關鍵字
總結:1、instance method 就是實例對象與函數的結合。
2、使用類調用,第一個參數明確的傳遞過去一個實例。
- 3、使用實例調用,調用的實例被作爲第一個參數被隱含的傳遞過去。
class method (參數需要添加“cls”)
類方法將類本身當做對象進行操作,在定義類方法時使用@classmethod裝飾器定義,其第一個參數是類,約定寫爲cls。類對象和實例對象都可以調用類方法。
class Test(object):
time = “On June 2”
@classmethod
def get_time(cls): #定義了類方法
return cls.time
test_time 是綁定在Test的方法,可以通過類來訪問(通過類的實例對象也可以訪問,但是傳遞過去的cls依舊是類)
調用該類函數 :
Test.get_time()
“On June 2”
Human().get_time()
“On June 2”
從上述結果可以看出通過類和類的實例對象均可以訪問類方法,但是傳遞過去的參數,類和實例對象是什麼呢?
class Test(object): time = “On June 2” @classmethod def get_time(cls): #定義了類方法 print (cls)
Test.get_time()
<class '__main__.Test'>
Test().get_time()
<class '__main__.Test'>
可以看到傳遞過去的參數均爲Test類,無論所訪問的是類還是類的實例對象,所傳入的cls參數均爲類,cls爲函數參數,調用時被隱含的傳遞進去。
總結:1、classmethod 是類對象與函數的結合。
2、可以使用和類的實例調用,但是都是將類作爲隱含參數傳遞過去。
- 3、使用類來調用 classmethod 可以避免將類實例化的開銷。
staticmethod
靜態方法是一種普通函數,不會對任何類或者對象進行操作。類對象和實例都可以調用靜態方法,
使用裝飾器@staticmethod定義靜態方法。
class Test(object):
@staticmethod
def add(a,b): #定義了靜態方法
return a + b
Test.add
<function __main__.add>
Test().add
<function __main__.add>
Test.add(1,2)
3
Test().add(1,2)
3
可以從上述代碼中發現,在類和實例中調用add靜態方法時,方法均是一個普通的函數,沒有綁定任何一個特定的類或者實例,可以使用類或者類的實例調用,並且沒有任何隱含參數的傳入。
總結:1、當一個函數邏輯上屬於一個類又不依賴與類的屬性的時候,可以使用staticmethod。
- 2、使用 staticmethod 可以避免每次使用的時都會創建一個對象的開銷。
- 3、staticmethod 可以使用類和類的實例調用。但是不依賴於類和類的實例的狀態。
對三種方法的歸納總結:
方法 | 調用情況 | 訪問權限 |
普通方法 | 可以通過實例來調用 | 可訪問實例屬性,無法訪問類屬性 |
類方法 | 可以通過類名和實例來調用 | 可訪問類屬性,無法訪問實例屬性 |
靜態方法 | 可以通過類名和實例來調用 | 無法訪問類屬性及實例屬性(僅可通過傳值的方式) |
參考資料
https://www.zhihu.com/question/22869546/answer/22933397
版權聲明:本文爲原創文章,未經博主允許不得轉載。