您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python中classmethod和staticmethod有什么區別,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
python中3種方式定義類方法,常規方式、@classmethod修飾方式、@staticmethod修飾方式。
class A(object): def foo(self, x): print('調用foo函數 (%s, %s)'%(self, x)) print('self:', self) @classmethod def class_foo(cls, x): print('調用class_foo函數 (%s, %s)' % (cls, x)) print('cls:', cls) @staticmethod def static_foo(x): print('調用static_foo函數 (%s)' % (x)) a = A()
1. 定義方式
普通foo()函數需要self參數隱式的傳遞當前類對象的實例。@classmethod修飾的方法class_foo()需要通過cls參數傳遞當前類對象。@staticmethod修飾的方法定義與普通函數是一樣的。
self和cls的區別不是強制的,只是PEP8中一種編程風格,slef通常用作實例方法的第一參數,cls通常用作類方法的第一參數。即通過self來傳遞當前類對象的實例,cls傳遞當前類對象。
2. 綁定對象
foo方法綁定對象A的實例 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沒有參數綁定。 print(a.static_foo) <function A.static_foo at 0x100727730>
3. 調用的方式
foo可通過實例a調用,類對象A直接調用會參數錯誤。
print(a.foo(1)) 調用foo函數 (<__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 或對象實例a調用。
a.class_foo(2) A.class_foo(2) 調用class_foo函數 (<class '__main__.A'>, 2) cls: <class '__main__.A'>
static_foo可通過類對象A 或對象實例a調用。
a = A() a.static_foo(3) A.static_foo(3) 調用static_foo函數 (3)
4. 繼承與覆蓋普通類函數一樣。
class C(A): pass c = C() c.foo(1) c.class_foo(1) c.static_foo(1)
運行結果:
調用foo函數 (<__main__.B object at 0x10246a2b0>, 1) self: <__main__.B object at 0x10246a2b0> 調用class_foo函數 (<class '__main__.B'>, 1) cls: <class '__main__.B'> 調用static_foo函數 (1)
關于Python中classmethod和staticmethod有什么區別就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。