python中類方法和靜態方法區別

面相對象程序設計中,類方法和靜態方法是經常用到的兩個術語。
邏輯上講:類方法是隻能由類名調用;靜態方法可以由類名或對象名進行調用。
在C++中,靜態方法與類方法邏輯上是等價的,只有一個概念,不會混淆。
而在Python中,方法分爲三類實例方法、類方法、靜態方法。代碼如下:

class Test(object):
def InstanceFun(self):
    print("InstanceFun");
    print(self);


@classmethod
def ClassFun(cls):
    print("ClassFun");
    print(cls);


@staticmethod
def StaticFun():
    print("StaticFun");
    t = Test();
    t.InstanceFun();      # 輸出InstanceFun,打印對象內存地址“<__main__.Test object at 0x0293DCF0>”
    Test.ClassFun();           # 輸出ClassFun,打印類位置 <class '__main__.Test'>
    Test.StaticFun();          # 輸出StaticFun
    t.StaticFun();             # 輸出StaticFun
    t.ClassFun();              # 輸出ClassFun,打印類位置 <class '__main__.Test'>
    Test.InstanceFun();        # 錯誤,TypeError: unbound method instanceFun() must be called with Test             instance as first argument
    Test.InstanceFun(t);       # 輸出InstanceFun,打印對象內存地址“<__main__.Test object at 0x0293DCF0>”
    t.ClassFun(Test);          # 錯誤   classFun() takes exactly 1 argument (2 given)

可以看到,在PYTHON中,兩種方法的主要區別在於參數。實例方法隱含的參數爲類實例self,而類方法隱含的參數爲類本身cls。
靜態方法無隱含參數,主要爲了類實例也可以直接調用靜態方法。

所以邏輯上類方法應當只被類調用,實例方法實例調用,靜態方法兩者都能調用。主要區別在於參數傳遞上的區別,實例方法悄悄傳遞的是self引用作爲參數,而類方法悄悄傳遞的是cls引用作爲參數。
Python實現了一定的靈活性使得類方法和靜態方法,都能夠被實例和類二者調用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章