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’表示傳給靜態方法的參數。
小結