溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中classmethod和staticmethod有什么區(qū)別

發(fā)布時間:2020-08-26 17:28:22 來源:億速云 閱讀:217 作者:Leah 欄目:編程語言

這篇文章將為大家詳細(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é)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(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)容。

AI