python 靜態方法和類方法

1.staticmethod

類的靜態方法,是類中使用staticmethod裝飾的方法??赏ㄟ^類本身或者類實例來調用,但是沒有任何附加的隱式參數傳遞。方法內部調用類屬性或者類方法的時候需要使用類的全名進行調用。

2. classmethod

使用 @classmethod 修飾器修飾的類型的方法,非私有的類方法可以通過類型本身或者類實例進行調用,并在調用時隱式傳遞類型本身作為第一個參數,該參數的形參名可以為任何合法變量名,但一般使用 cls。

3.相同點:

  • 非私有 類方法 和 類靜態方法 都可以通過類實例和類本身進行調用。
  • 都可以通過繼承被派生類擁有并重寫。
  • 都無法在方法內部調用 類實例屬性 和 類實例方法。

4.不同點:

  • 類方法 在調用時會隱式傳遞類型作為第一個參數;而 類靜態方法 不會隱式傳遞任何值。
  • 類方法 的方法體中可以通過傳遞進來的類型實參調用該類型的 類屬性 和 類方法;而 類靜態方法 內部不知道任何關于類型或者類實例的信息,** 但是可以通過類型本身的類型全名調用 類屬性 和 類方法。**

5.例子:

class Base(object):
    # 類屬性
    ClassProperty = 0
    def __init__(self, first, second):
        # 類實例屬性
        self.InstanceProperty = ""
        self.InstanceProperty1 = first
        self.instanceProperty2 = second
    def instance_method(self, msg):
        self.InstanceProperty = msg
        print self.__class__.__name__ + " instance_method" + self.InstanceProperty
    @classmethod
    def class_method(cls, msg):
        print cls.__name__ + " class_method" + msg
    @staticmethod
    def static_method(msg):
        print "static_method" + msg
    @classmethod
    def instance_factory_classmethod(cls, first):
        return cls(first, 100)
    @staticmethod
    def instance_factory_staticmethod(frist):
        return Base(frist, 200)
class DerivedA(Base):
    ClassProperty = ""
class DerivedB(Base):
    @classmethod
    def class_method(cls, msg):
        print cls.__name__ + " class_method" + msg
    @staticmethod
    def static_method(msg):
        print "Overrided static_method" + msg
if __name__ == "__main__":
    DerivedA(1, 2).instance_method(" called by instance")
    DerivedA(1, 2).class_method(" called by instance.")
    DerivedA.class_method(" called by Derived class itself.")
    DerivedA(1, 2).static_method(" called by instance.")
    DerivedA.static_method(" called by Derived class itself.")
    DerivedA.ClassProperty = "DerivedA.ClassProperty"
    print DerivedA.ClassProperty
    print '\n'
    DerivedB(1, 2).class_method(" called by instance.")
    DerivedB(1, 2).class_method(" called by instance.")
    DerivedB.class_method(" called by Derived class itself.")
    DerivedB(1, 2).static_method(" called by instance.")
    DerivedB.static_method(" called by Derived class itself.")
    print DerivedB.ClassProperty
    # 通過類靜態方法獲取類實例
    print isinstance(DerivedA.instance_factory_staticmethod(1), DerivedA)
    # 通過類方法后去類實例
    print isinstance(DerivedB.instance_factory_classmethod(1), DerivedB)

運行結果:

DerivedA instance_method called by instance
DerivedA class_method called by instance.
DerivedA class_method called by Derived class itself.
static_method called by instance.
static_method called by Derived class itself.
DerivedA.ClassProperty


DerivedB class_method called by instance.
DerivedB class_method called by instance.
DerivedB class_method called by Derived class itself.
Overrided static_method called by instance.
Overrided static_method called by Derived class itself.
0
False
True
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 常量與變量使用let來聲明常量,使用var來聲明變量。聲明的同時賦值的話,編譯器會自動推斷類型。值永遠不會被隱式轉...
    莫_名閱讀 461評論 0 1
  • 實例方法: 顧名思義就是給實例使用的方法。就是我們使用最普遍的在類內部定義的方法。 實例方法第一個參數為 self...
    4ffde5305e8f閱讀 1,248評論 0 8
  • 要點: 函數式編程:注意不是“函數編程”,多了一個“式” 模塊:如何使用模塊 面向對象編程:面向對象的概念、屬性、...
    victorsungo閱讀 1,552評論 0 6
  • (以前常和人談論愛情是緣分還是註定?我總是說愛情是註定的緣分,我在想會不會其實愛你的人一直在,只是不能感知,直到時...
    綠蘿菇涼閱讀 260評論 0 0
  • 2014年四月老虎剛剛發起百人百天的時候我根本跑不起來。作為一只虛弱的中年胖子我只能走走停停,喘口氣,再走走停停,...
    薇薇安的30天閱讀 143評論 0 0