Python 類 以及self.方法、cls.方法與sta.方法的區別

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、使用類調用,第一個參數明確的傳遞過去一個實例。

  1. 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、可以使用和類的實例調用,但是都是將類作爲隱含參數傳遞過去。

  1. 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。

  1. 2、使用 staticmethod 可以避免每次使用的時都會創建一個對象的開銷。
  2. 3、staticmethod 可以使用類和類的實例調用。但是不依賴於類和類的實例的狀態。


對三種方法的歸納總結:

方法調用情況訪問權限
普通方法可以通過實例來調用可訪問實例屬性,無法訪問類屬性
類方法可以通過類名和實例來調用可訪問類屬性,無法訪問實例屬性
靜態方法可以通過類名和實例來調用無法訪問類屬性及實例屬性(僅可通過傳值的方式)

參考資料

https://www.zhihu.com/question/22869546/answer/22933397


版權聲明:本文爲原創文章,未經博主允許不得轉載。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章