這篇文章將為大家詳細(xì)講解有關(guān)Python中classmethod和staticmethod有什么區(qū)別,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)建站主營(yíng)虎丘網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,APP應(yīng)用開發(fā),虎丘h5微信小程序開發(fā)搭建,虎丘網(wǎng)站營(yíng)銷推廣歡迎虎丘等地區(qū)企業(yè)咨詢
python中3種方式定義類方法,常規(guī)方式、@classmethod修飾方式、@staticmethod修飾方式。
class A(object): def foo(self, x): print('調(diào)用foo函數(shù) (%s, %s)'%(self, x)) print('self:', self) @classmethod def class_foo(cls, x): print('調(diào)用class_foo函數(shù) (%s, %s)' % (cls, x)) print('cls:', cls) @staticmethod def static_foo(x): print('調(diào)用static_foo函數(shù) (%s)' % (x)) a = A()
1. 定義方式
普通foo()函數(shù)需要self參數(shù)隱式的傳遞當(dāng)前類對(duì)象的實(shí)例。@classmethod修飾的方法class_foo()需要通過(guò)cls參數(shù)傳遞當(dāng)前類對(duì)象。@staticmethod修飾的方法定義與普通函數(shù)是一樣的。
self和cls的區(qū)別不是強(qiáng)制的,只是PEP8中一種編程風(fēng)格,slef通常用作實(shí)例方法的第一參數(shù),cls通常用作類方法的第一參數(shù)。即通過(guò)self來(lái)傳遞當(dāng)前類對(duì)象的實(shí)例,cls傳遞當(dāng)前類對(duì)象。
2. 綁定對(duì)象
foo方法綁定對(duì)象A的實(shí)例 print(a.foo)> class_foo方法綁定對(duì)象A print(a.class_foo) > static_foo沒(méi)有參數(shù)綁定。 print(a.static_foo)
3. 調(diào)用的方式
foo可通過(guò)實(shí)例a調(diào)用,類對(duì)象A直接調(diào)用會(huì)參數(shù)錯(cuò)誤。
print(a.foo(1)) 調(diào)用foo函數(shù) (<__main__.A object at 0x10245ccf8>, 1) self: <__main__.A object at 0x10245ccf8> print(A.foo(1)) Traceback (most recent call last): File "/Users/liuhuiling/Desktop/MT_code/OPUnittest/case/demo.py", line 63, inprint(A.foo(1)) TypeError: foo() missing 1 required positional argument: 'x'
class_foo可通過(guò)類對(duì)象A 或?qū)ο髮?shí)例a調(diào)用。
a.class_foo(2) A.class_foo(2) 調(diào)用class_foo函數(shù) (, 2) cls:
static_foo可通過(guò)類對(duì)象A 或?qū)ο髮?shí)例a調(diào)用。
a = A() a.static_foo(3) A.static_foo(3) 調(diào)用static_foo函數(shù) (3)
4. 繼承與覆蓋普通類函數(shù)一樣。
class C(A): pass c = C() c.foo(1) c.class_foo(1) c.static_foo(1)
運(yùn)行結(jié)果:
調(diào)用foo函數(shù) (<__main__.B object at 0x10246a2b0>, 1) self: <__main__.B object at 0x10246a2b0> 調(diào)用class_foo函數(shù) (, 1) cls: 調(diào)用static_foo函數(shù) (1)
關(guān)于Python中classmethod和staticmethod有什么區(qū)別就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。