Python實例方法、類方法和靜態方法

Python類的組成主要包含兩個部分,類的屬性和類的方法。類的屬性是對數據的封裝,這些數據是用來描述類所抽象的事物的特徵;類的方法是用來表示對象的特定行爲。Python的類的方法又能夠進一步細分爲三種不一樣類型,即實例方法、類方法和靜態方法。函數

這裏就是對類的這三種方法進行詳細討論,包括它們是如何實現、如何被調用以及各自的特色。spa

實例方法code

實例方法是你在Python中將會在大多數狀況下使用到的最基本、最簡單的方法,該方法必須接受一個參數,通常狀況下咱們將這個參數約定寫成self,self參數傳入的是類的實例化對象。對象

實例方法的使用:blog

定義了一個student類,student類中實現了一個名爲get_info實例方法,在get_info實例方法中打印出對象相關信息。get

class student(object):
    def __init__(self, _name, _age):
        self.name = _name
        self.age  = _age
        
    def get_info(self):
        print('%s is %d years old !' %(self.name, self.age))

if __name__ == '__main__':
  s = student('LiMing', 12)
  s.get_info()

s是使用student類實例化的對象,類的實例方法經過 s.get_info() 方式被調用。在調用實例方法時,s實例對象會被自動的做爲參數傳給get_info中的第一個self參數中,self也就表明s對象。string

能夠看出,經過self參數,實例方法能夠自由地訪問同一對象上的屬性和其餘方法。當涉及到修改對象的狀態時,實例方法就很是給力。it

類方法class

類方法在Python中使用的比較少,類方法不接受self參數,而是接受一個cls參數,cls參數調用時指向的是類而不是實例對象。一般狀況下,類方法使用@classmethod裝飾器來修飾。與實例方法不一樣的是,類方法能夠經過類直接調用,也能夠經過實例對象直接調用。但不管哪一種調用方式,最左側傳入的參數必定是類自己。object

(注意cls參數和實例方法self參數同樣也是約定寫成的,可使用其它名字代替)

類方法的使用:

使用類方法增長前面定義的student類的功能,讓每一個student類的對象能夠獲得當前實例化student對象的個數。

class student(object):
    total_num = 0
    
    def __init__(self, _name, _age):
        self.name = _name
        self.age  = _age
        
    def __new__(cls, *args, **kwargs):
        cls.set_num()
        return object.__new__(cls)
        
    @classmethod
    def set_num(cls):
        cls.total_num += 1
        
    @classmethod
    def get_num(cls):
        return cls.total_num
        
    def get_info(self):
        print('%s is %d years old !' %(self.name, self.age))

if __name__ == "__main__": a = student('a', 10)
print(a.get_num()) b = student('b', 10) print(b.get_num())

新的student類中引入的類屬性total_num,重寫了__new__方法,使得在每次建立一個實例對象時能調用類方法set_num讓類屬性total_num加一,total_num表明當前實例化student個數。set_num和get_num都是類方法,它只能訪問到類屬性。

類屬性和實例屬性有所不一樣,無論建立了多少類對象,他們的類屬性只有1個,也就是說類屬性屬於類而不屬於對象。

類方法實現工廠模式

class student(object):
    
    def __init__(self, _name, _age):
        self.name = _name
        self.age  = _age
        
    def get_info(self):
        print('%s is %d years old !' %(self.name, self.age))
        
    @classmethod
    def factory(cls):
        return cls('init', 10)
        
if __name__ == "__main__":
    a = student.factory()
    b = student.factory()
    print(a)
    print(b)

靜態方法

靜態方法即不接受self參數,也不接受cls參數,但它能夠接受其餘任意數量的參數。與類方法同樣,靜態方法也使用一個裝飾器修飾,修飾符爲@staticmethod。

因爲靜態方法不接受self參數和cls參數,靜態方法不能修改對象狀態和類狀態。所以,靜態方法主要是用來存放邏輯性的代碼,邏輯上屬於類,可是和類自己沒有關係。能夠理解爲,靜態方法是個獨立的、單純的函數,它僅僅託管於某個類的名稱空間中,便於使用和維護。 

靜態方法的使用:

class student(object):
    
    def __init__(self, _name, _age):
        self.name = _name
        self.age  = _age
        
    def get_info(self):
        print('%s is %d years old !' %(self.name, self.age))
        
    @staticmethod
    def do_something(string):
        print(string)
        
if __name__ == "__main__":
    a = student('a', 10)
    a.do_something('staticmethod')

靜態方法的調用方式和類實例方法的調用方式同樣,只是在調用時Python解釋器不會將實例對象強制綁定在靜態方法的第一個參數上。a.do_something('staticmethod')即靜態方法的調用, ‘staticmethod’表示傳給靜態方法的參數。

小結

  • 實例方法須要實例對象調用,經過self參數訪問到該實例。實例方法能夠用來修改實例化對象的狀態信息。
  • 類方法不能訪問到類的實例對象狀態,但它能夠訪問類的屬性。類方法可使用類調用,也可使用實例直接調用,但傳入的類方法左側的參數是類自己。
  • 靜態方法無權訪問到self和cls,能夠當作是一個獨立的、單純的函數,但它屬於類的名稱空間中。
相關文章
相關標籤/搜索