您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Python中classmethod和staticmethod有什么區(qū)別,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
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)前類對象的實(shí)例。@classmethod修飾的方法class_foo()需要通過cls參數(shù)傳遞當(dāng)前類對象。@staticmethod修飾的方法定義與普通函數(shù)是一樣的。
self和cls的區(qū)別不是強(qiáng)制的,只是PEP8中一種編程風(fēng)格,slef通常用作實(shí)例方法的第一參數(shù),cls通常用作類方法的第一參數(shù)。即通過self來傳遞當(dāng)前類對象的實(shí)例,cls傳遞當(dāng)前類對象。
2. 綁定對象
foo方法綁定對象A的實(shí)例 print(a.foo) <bound method A.foo of <__main__.A object at 0x100721cf8>> class_foo方法綁定對象A print(a.class_foo) <bound method A.class_foo of <class '__main__.A'>> static_foo沒有參數(shù)綁定。 print(a.static_foo) <function A.static_foo at 0x100727730>
3. 調(diào)用的方式
foo可通過實(shí)例a調(diào)用,類對象A直接調(diào)用會參數(shù)錯誤。
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, in <module> print(A.foo(1)) TypeError: foo() missing 1 required positional argument: 'x'
class_foo可通過類對象A 或?qū)ο髮?shí)例a調(diào)用。
a.class_foo(2) A.class_foo(2) 調(diào)用class_foo函數(shù) (<class '__main__.A'>, 2) cls: <class '__main__.A'>
static_foo可通過類對象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ù) (<class '__main__.B'>, 1) cls: <class '__main__.B'> 調(diào)用static_foo函數(shù) (1)
關(guān)于Python中classmethod和staticmethod有什么區(qū)別就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。