1预烙、實(shí)例方法
實(shí)例方法既可以調(diào)用靜態(tài)方法也可以調(diào)用類方法正塌。
# 定義一個(gè)類
class A(object):
# 類屬性
count = 0
def __init__(self):
self.name = '孫悟空'
# 實(shí)例方法
# 在類中定義当纱,以self為第一個(gè)參數(shù)的方法都是實(shí)例方法
# 實(shí)例方法在調(diào)用時(shí)呛每,Python會(huì)將調(diào)用對(duì)象作為self傳入
# 實(shí)例方法可以通過(guò)實(shí)例和類去調(diào)用
# 當(dāng)通過(guò)實(shí)例調(diào)用時(shí),會(huì)自動(dòng)將當(dāng)前調(diào)用對(duì)象作為self傳入
# 當(dāng)通過(guò)類調(diào)用時(shí)坡氯,不會(huì)自動(dòng)傳遞self晨横,此時(shí)我們必須手動(dòng)傳遞self
def test(self):
print('這是test方法~~~ ' , self)
# 創(chuàng)建A類對(duì)象
a = A()
# 通過(guò)對(duì)象調(diào)用test方法
a.test()
# 通過(guò)類直接調(diào)用test方法
# 需要手動(dòng)傳入一個(gè)對(duì)象
A.test(a)
# 所以# a.test() 等價(jià)于 A.test(a)
2洋腮、類方法
類方法特點(diǎn)
- 在類內(nèi)部使用
@classmethod
來(lái)修飾的方法屬于類方法。 - 對(duì)于類方法手形,第一個(gè)參數(shù)必須是類對(duì)象啥供,一般以
cls
作為第一個(gè)參數(shù),就是class
的簡(jiǎn)寫(xiě)库糠。
類方法使用場(chǎng)景
- 當(dāng)方法中 需要使用類對(duì)象 (如訪問(wèn)私有類屬性等)時(shí)伙狐,定義類方法
- 類方法一般和類屬性配合使用
# 定義一個(gè)類
class A(object):
# 類屬性
count = 0
__age = 18
def __init__(self):
self.name = '孫悟空'
# 實(shí)例方法
# 在類中定義,以self為第一個(gè)參數(shù)的方法都是實(shí)例方法
# 實(shí)例方法在調(diào)用時(shí)瞬欧,Python會(huì)將調(diào)用對(duì)象作為self傳入
# 實(shí)例方法可以通過(guò)實(shí)例和類去調(diào)用
# 當(dāng)通過(guò)實(shí)例調(diào)用時(shí)贷屎,會(huì)自動(dòng)將當(dāng)前調(diào)用對(duì)象作為self傳入
# 當(dāng)通過(guò)類調(diào)用時(shí),不會(huì)自動(dòng)傳遞self艘虎,此時(shí)我們必須手動(dòng)傳遞self
def test(self):
print('這是test方法~~~ ', self)
# 類方法
# 在類內(nèi)部使用 @classmethod 來(lái)修飾的方法屬于類方法
# 類方法的第一個(gè)參數(shù)是cls唉侄,也會(huì)被自動(dòng)傳遞,cls就是當(dāng)前的類對(duì)象
# 類方法和實(shí)例方法的區(qū)別顷帖,實(shí)例方法的第一個(gè)參數(shù)是self美旧,而類方法的第一個(gè)參數(shù)是cls
# 類方法可以通過(guò)類去調(diào)用,也可以通過(guò)實(shí)例調(diào)用贬墩,沒(méi)有區(qū)別
@classmethod
def test_2(cls):
# cls就是當(dāng)前所在類的類對(duì)象
print('這是test_2方法榴嗅,他是一個(gè)類方法~~~ ', cls)
# 可以通過(guò)cls直接調(diào)用類中的類屬性
print(cls.count)
return cls.__age
# 創(chuàng)建A類對(duì)象
a = A()
# 通過(guò)對(duì)象調(diào)用test_2方法
a.test_2()
# 通過(guò)類直接調(diào)用test_2方法
A.test_2()
# A.test_2() 等價(jià)于 a.test_2()
3、靜態(tài)方法
靜態(tài)方法特點(diǎn)
- 在類中使用
@staticmethod
來(lái)修飾的方法屬于靜態(tài)方法陶舞,靜態(tài)方法既不需要傳遞類對(duì)象也不需要傳遞實(shí)例對(duì)象(形參沒(méi)有self/cls)嗽测,如果有需要,需要什么參數(shù)肿孵,就填寫(xiě)什么參數(shù)就可以唠粥。 - 靜態(tài)方法 也能夠通過(guò) 實(shí)例對(duì)象 和 類對(duì)象 去訪問(wèn)。
靜態(tài)方法使用場(chǎng)景
- 當(dāng)方法中 既不需要使用實(shí)例對(duì)象(如實(shí)例對(duì)象停做,實(shí)例屬性)晤愧,也不需要使用類對(duì)象 (如類屬性、類方法蛉腌、創(chuàng)建實(shí)例等)時(shí)官份,定義靜態(tài)方法
- 取消不需要的參數(shù)傳遞,有利于 減少不必要的內(nèi)存占用和性能消耗
# 定義一個(gè)類
class A(object):
# 類屬性
count = 0
def __init__(self):
self.name = '孫悟空'
# 實(shí)例方法
# 在類中定義烙丛,以self為第一個(gè)參數(shù)的方法都是實(shí)例方法
# 實(shí)例方法在調(diào)用時(shí)舅巷,Python會(huì)將調(diào)用對(duì)象作為self傳入
# 實(shí)例方法可以通過(guò)實(shí)例和類去調(diào)用
# 當(dāng)通過(guò)實(shí)例調(diào)用時(shí),會(huì)自動(dòng)將當(dāng)前調(diào)用對(duì)象作為self傳入
# 當(dāng)通過(guò)類調(diào)用時(shí)河咽,不會(huì)自動(dòng)傳遞self钠右,此時(shí)我們必須手動(dòng)傳遞self
def test(self):
print('這是test方法~~~ ', self)
# 類方法
# 在類內(nèi)部使用 @classmethod 來(lái)修飾的方法屬于類方法
# 類方法的第一個(gè)參數(shù)是cls,也會(huì)被自動(dòng)傳遞忘蟹,cls就是當(dāng)前的類對(duì)象
# 類方法和實(shí)例方法的區(qū)別飒房,實(shí)例方法的第一個(gè)參數(shù)是self搁凸,而類方法的第一個(gè)參數(shù)是cls
# 類方法可以通過(guò)類去調(diào)用,也可以通過(guò)實(shí)例調(diào)用情屹,沒(méi)有區(qū)別
@classmethod
def test_2(cls):
# cls就是當(dāng)前所在類的類對(duì)象
print('這是test_2方法坪仇,他是一個(gè)類方法~~~ ', cls)
# 可以通過(guò)cls直接調(diào)用類中的類屬性
print(cls.count)
# 靜態(tài)方法
# 在類中使用 @staticmethod 來(lái)修飾的方法屬于靜態(tài)方法
# 靜態(tài)方法不需要指定任何的默認(rèn)參數(shù),
# 靜態(tài)方法可以通過(guò)類和實(shí)例去調(diào)用垃你。
# 靜態(tài)方法,基本上是一個(gè)和當(dāng)前類無(wú)關(guān)的方法喂很,它只是一個(gè)保存到當(dāng)前類中的函數(shù)
# 靜態(tài)方法一般都是一些工具方法惜颇。
@staticmethod
def test_3():
print('test_3執(zhí)行了~~~')
# 創(chuàng)建A類對(duì)象
a = A()
# 通過(guò)對(duì)象調(diào)用test_3方法
a.test_3()
# 通過(guò)類直接調(diào)用test_3方法
A.test_3()
# A.test_3() 等價(jià)于 a.test_3()
"""
靜態(tài)方法和函數(shù)的區(qū)別:
靜態(tài)方法必須要用類對(duì)象或者實(shí)例對(duì)象來(lái)調(diào)用。
函數(shù)直接使用少辣。
"""