眾所周知,類是創(chuàng)建實例的模板早像,而實例是一個個具體的對象僻肖,各個實例擁有的數(shù)據(jù)相互獨立、互不影響卢鹦。
在類中定義的函數(shù)稱為方法臀脏,主要有三種:實例方法、類方法冀自、靜態(tài)方法
class A:
def instance_method(self, n):
print('self', self)
@classmethod
def class_method(cls, n):
print('cls', cls)
@staticmethod
def static_method():
print('this is a static method')
上面類 A 定義的三個方法分別是實例方法揉稚、類方法、靜態(tài)方法熬粗,下面我們來詳細分析
實例方法
不帶裝飾器的實例方法在類定義中是最常見的:
定義中搀玖,傳入的第一個參數(shù)必須是 self
,表示實例本身驻呐,在其中可使用 self.attr
獲取實例的屬性灌诅。
a = A()
a.instance_method(2)
print(A.bar)
print(a.bar)
下面是程序運行結(jié)果:
self <__main__.A object at 0x0000028554C87E48>
grg
grg
當我們創(chuàng)建了實例 a 之后,調(diào)用 a.instance_method(2) 時含末,實例 a 會被自動傳入函數(shù)作為 self 參數(shù)猜拾。
如果我們調(diào)用 A.instance_method(2) 時會發(fā)生什么呢?即佣盒,類能不能調(diào)用實例方法挎袜?
Traceback (most recent call last):
File "I:\Program Code\Python\test2.py", line 32, in <module>
A.instance_method(2)
TypeError: instance_method() missing 1 required positional argument: 'n'
可以看到,數(shù)字 2 被傳入 self 參數(shù)了肥惭,所以才會提示缺少一個位置參數(shù) n盯仪,所以,實例方法不能由類調(diào)用务豺。
順便提一句磨总,屬性也分實例屬性和類屬性嗦明,上例直接定義的是類屬性笼沥,類和類實例都可以訪問。類中定義的方法也可以無限制訪問這個類屬性娶牌。
通過 __init__(self奔浅,attr)
定義的是實例屬性,只有實例能訪問诗良,類不能訪問汹桦。類中定義的屬性只有傳進了 self
參數(shù)的方法(通常就是實例方法)可訪問。
classmethod
無需實例化鉴裹,但與實例方法第一個參數(shù)必須是 self
類似舞骆,類方法第一個參數(shù)表示類自身的 cls
參數(shù)钥弯,可以來調(diào)用類的屬性、類的方法督禽、類的實例化對象等
a.class_method(2)
A.class_method(2)
觀察上面代碼的運行結(jié)果:
cls <class '__main__.A'>
cls <class '__main__.A'>
可知脆霎,類方法既可以由類調(diào)用,也可以由實例調(diào)用狈惫。
再來看一個例子:
class Book(object):
def __init__(self, title):
self.title = title
@classmethod
def create(cls, title):
book = cls(title)
return book
book1 = Book('A song of Ice and Fire')
book2 = Book.create('The Marvel')
print(book1.title)
print(book2.title)
運行結(jié)果如下:
A song of Ice and Fire
The Marvel
上面睛蛛,類方法創(chuàng)建了一個類實例。
staticmethod
無需 self
參數(shù)胧谈,無需 cls
參數(shù)忆肾,直接聲明一個靜態(tài)方法,可無需實例化菱肖,直接由類調(diào)用客冈,也可實例化后調(diào)用。
帶 staticmethod 裝飾器定義的就是靜態(tài)方法稳强,與普通函數(shù)沒有區(qū)別郊酒,可以不加參數(shù),可以加任意參數(shù)键袱,不必傳入 self 燎窘,既可以由實例調(diào)用,也可以由類調(diào)用蹄咖。
A.static_method()
a.static_method()
運行結(jié)果如下:
this is a static method
this is a static method
總結(jié)
實例方法只能由實例調(diào)用褐健,類方法和靜態(tài)方法可以由實例或類調(diào)用。