Python 普通方法和staticmethod與classmethod的區(qū)別

不說廢話直接Show me the code,整理來源:http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python

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()

先看看常規(guī)調(diào)用方法時打印出self,發(fā)現(xiàn)是一個指向內(nèi)存的對象

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)

With classmethods, 打印顯示的是A的class類型

a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

我們也可以通過A.class_foo()來直接調(diào)用類方法,但是通過A.foo()這樣的調(diào)用會引起TypeError.

A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

classmethods 的一種使用方式是利用描述符的功能去實現(xiàn)可繼承可變的構(gòu)造函數(shù) inheritable alternative constructors.

With static methods, 既不需要class參數(shù)也不需要self,可以通過以下兩種方式進行調(diào)用

a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)

foo只是一個方法, 但是調(diào)用a.foo 的時候不是僅僅的得到了這個方法,我們得到了這個對象 a 的foo方法的"partially applied" ,對象a默認綁定到這個方法的第一個參數(shù) ,方法foo 指定了兩個參數(shù),但是 a.foo實際只需要開發(fā)者傳入一個參數(shù). 我們來對方法進行打印來進一步看看里面的奧妙.

對象a是綁定到foo()這個方法上的:

print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

我們接下來調(diào)用a.class_foo, 發(fā)現(xiàn)對象a 不是綁定到class_foo這個方法上,而是類A綁定到方法class_foo上.

print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>

staticmethod 就更直接,什么也不綁定

print(a.static_foo)
# <function static_foo at 0xb7d479cc>

通過類調(diào)用也是一樣的.

print(A.static_foo)
# <function static_foo at 0xb7d479cc>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,068評論 0 9
  • 一位初入職場的朋友來信問:我是一名大三實習生,現(xiàn)在在工廠做外貿(mào)業(yè)務(wù)跟單,才做幾天感覺不想做了。業(yè)務(wù)跟單這一職位特別...
    人生葵花寶典閱讀 507評論 0 5

友情鏈接更多精彩內(nèi)容