2012年3月21日 星期三

boundmethod,classmethod,staticmethod 分別

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"

沒有留言:

張貼留言