方法和函數(shù)的區(qū)分
很多童鞋會比較疑惑梗掰,方法和函數(shù)有什么區(qū)別嵌言,都是通過def去定義的啊及穗?
只需要記住一點(diǎn)摧茴,方法是用來描述一個目標(biāo)的行為動作!
不論你是直接通過 類名.方法調(diào)用,還是通過由類生成的實(shí)例.方法調(diào)用拥坛。
方法都需要有一個目標(biāo)才能完成調(diào)用的操作蓬蝶。
方法分類
談到python的方法,很多人認(rèn)為就是一個class 然后跟你的方法名稱就完了猜惋,哪有什么分類丸氛?
最開始學(xué)類的時候我也是這么認(rèn)為,并且很多的入門書中也沒有提及這些著摔。
那么缓窜,到底方法分為哪幾類呢?
讓我們先來看一段代碼
class MainClass:
def shilifangfa(self):
print('這是一個實(shí)例方法')
@classmethod
def leifangfa(cls):
print('這是一個類方法')
@staticmethod
def jingtaifangfa():
print('這是一個靜態(tài)方法')
m=MainClass()
m.shilifangfa()
m.leifangfa()
m.jingtaifangfa()
output:
這是一個實(shí)例方法
這是一個類方法
這是一個靜態(tài)方法
好吧谍咆,先說下方法的分類吧:
- 實(shí)例方法
- 類方法
- 靜態(tài)方法
初步展示方法的區(qū)別
可是禾锤,這三種方法有什么區(qū)別呢,光看上面的這段代碼摹察,沒有任何差異啊恩掷。
那么我們把這段代碼稍作修改
class MainClass:
def shilifangfa(self):
print('這是一個實(shí)例方法',self)
@classmethod
def leifangfa(cls):
print('這是一個類方法',cls)
@staticmethod
def jingtaifangfa():
print('這是一個靜態(tài)方法')
m=MainClass()
m.shilifangfa()
m.leifangfa()
m.jingtaifangfa()
output:
這是一個實(shí)例方法 <__main__.MainClass object at 0x00000000012AF0B8>
這是一個類方法 <class '__main__.MainClass'>
這是一個靜態(tài)方法
這次的輸出和上次相比,是否看到實(shí)例方法供嚎,我們需要傳給它一個實(shí)例對象黄娘,而類方法我們需要傳給他的是一個類
那么如果我們給實(shí)例方法傳輸?shù)牟皇且粋€由類產(chǎn)生的實(shí)例會如何呢?
MainClass.shilifangfa()
TypeError: shilifangfa() missing 1 required positional argument: 'self'
報(bào)錯的意思很明顯峭状,我們需要傳給他一個實(shí)例的名稱,當(dāng)然你也可以隨便寫一個數(shù)值去傳遞逼争,那么也就沒有作為實(shí)例方法的意義了
說了實(shí)例方法优床,那么類方法呢?同樣我們換一種方式去調(diào)用
MainClass.leifangfa()
這是一個類方法 <class 'main.MainClass'>
實(shí)例方法與類方法的細(xì)化區(qū)別
這次沒有任何變化誓焦,為什么呢胆敞?
原因在于,當(dāng)使用類方法時杂伟,傳遞的參數(shù)應(yīng)該是一個類名移层,但如果是實(shí)例,系統(tǒng)會自動找到實(shí)例對應(yīng)的類名稱
仔細(xì)看看下面的代碼稿壁,你會對實(shí)例方法與類方法有更詳細(xì)的認(rèn)識
class MainClass:
a=100 # 方法本身的屬性
def shilifangfa(self):
print('這是一個實(shí)例方法',self.a)
print(self.index) # 正常訪問
self.a=200 # 相當(dāng)于實(shí)例本身創(chuàng)建了一個屬性
print(self.a) # output a=200
print(MainClass.a) # output a=100
@classmethod
def leifangfa(cls):
print(cls.index) # type object 'MainClass' has no attribute 'index'
# 注意這句type object 它變相的告訴你幽钢,類也是一個對象,只不過是一個type的對象
# 這就更驗(yàn)證了python中的那句傅是,萬物皆對象
print('這是一個類方法',cls.a)
cls.a = 200 # 修改了類本身的a
print(cls.a) # output a=200
print(MainClass.a) # output a=200
# print(cls.index) # 類方法無法獲取到實(shí)例的屬性
@staticmethod
def jingtaifangfa():
print('這是一個靜態(tài)方法')
m=MainClass()
m.index=1000 # 實(shí)例本身的屬性
m.shilifangfa()
MainClass.leifangfa()
m.jingtaifangfa()
?本文由簡書作者:清風(fēng)Python 原創(chuàng) 如需轉(zhuǎn)載請注明