boundmethod | classmethod | staticmethod | |
classname | Foo.method(ff) | Foo.method() | Foo.method() |
instance | ff.method() | foo.method() | ff.method() |
classmethod和staticmethod的差異:
classmethod 綁定第一個參數是類別物件
第一個參數是cls 可用來access 類別變數
staticmethod 不綁定第一個參數是類別物件
詳細差異可參考此篇:http://caterpillar.onlyfun.net/Gossip/Python/StaticClassMethod.html
ff = Foo()
ff是實體
Foo是類別名
#-*- coding:utf8 -*-
# classmethod_and_staticmethod.py
class Foo(object):
def test(self): #bound method
print ("object")
@classmethod
def test2(clss):#class method
print ("class")
@staticmethod
def test3(): #static method
print ("static")
ff = Foo() #Foo是類別名,ff是實體名
#call bound method => 類別名.方法名(實體名)|實體名.方法名
Foo.test(ff)
ff.test()
#call classmethod => 類別名或實體名.方法名
Foo.test2()
ff.test2()
#call staticmethod => 類別名或實體名.方法名
Foo.test3()
ff.test3()
#如果Foo有了子類別覆蓋了父類的classmethod,staticmethod,bound method ,最終會調用子類的方法並傳遞的是子類的類對象
class Foo2(Foo):
def test(self):
print ("boundmethod overwrite")
@classmethod
def test2(clz):
print clz
print "classmethod overwrite"
@staticmethod
def test3():
print ("staticmethod overwrite")
foo2 = Foo2()
foo2.test() #show "boundmethod overwrite"
foo2.test2()#show "classmethod overwrite"
foo2.test3()#show "staticmethod overwrite"
沒有留言:
張貼留言