基於python中staticmethod和classmethod的區別

來源:互聯網
上載者:User
這篇文章主要介紹了關於基於python中staticmethod和classmethod的區別,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

例子

class A(object):  def foo(self,x):    print "executing foo(%s,%s)"%(self,x)  @classmethod  def class_foo(cls,x):    print "executing class_foo(%s,%s)"%(cls,x)  @staticmethod  def static_foo(x):    print "executing static_foo(%s)"%x  a=A()

上述類有三個函數,使用如下:

a.foo(1)# executing foo(<__main__.A object at 0xb7dbef0c>,1)-----------------------------------------------------------------a.class_foo(1)# executing class_foo(<class '__main__.A'>,1)A.class_foo(1)# executing class_foo(<class '__main__.A'>,1)-----------------------------------------------------------------a.static_foo(1)# executing static_foo(1)A.static_foo('hi')# executing static_foo(hi)

區別

• foo()的調用者必須是類A的一個執行個體,class_foo()與static_foo()的調用者既可以是類也可以是某個執行個體

• 參數不同,foo() 參數為self和其他參數,class_foo()參數使用類(cls)替換了self,static_foo()則只有參數,沒有self和類(cls)

• a.foo(1)中的foo()與a是綁定的,class_foo()是與類綁定的,而static_foo()與這兩者都沒有綁定,可以使用print來查看,如下:

"print(a.foo)# <bound method A.foo of <main.A object at 0xb7d52f0c>>print(a.class_foo)# <bound method type.class_foo of <class 'main.A'>>print A.class_foo<bound method classobj.class_foo of >print(a.static_foo)# print(A.static_foo)# "

作用

• 使用情境:classmethod在一些工廠類的情況下使用較多,也就是說OOP裡繼承的時候使用,staticmethod一般情況下可以替換為外部的函數,後者繼承的時候不可更改,和C++/JAVA中的靜態方法很相似

• 有利於組織代碼,同時有利於命名空間的整潔

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.