1.staticmethod
類的靜態(tài)方法横堡,是類中使用staticmethod裝飾的方法莺丑。可通過類本身或者類實例來調(diào)用结榄,但是沒有任何附加的隱式參數(shù)傳遞中贝。方法內(nèi)部調(diào)用類屬性或者類方法的時候需要使用類的全名進行調(diào)用。
2. classmethod
使用 @classmethod 修飾器修飾的類型的方法臼朗,非私有的類方法可以通過類型本身或者類實例進行調(diào)用邻寿,并在調(diào)用時隱式傳遞類型本身作為第一個參數(shù),該參數(shù)的形參名可以為任何合法變量名视哑,但一般使用 cls绣否。
3.相同點:
- 非私有 類方法 和 類靜態(tài)方法 都可以通過類實例和類本身進行調(diào)用。
- 都可以通過繼承被派生類擁有并重寫挡毅。
- 都無法在方法內(nèi)部調(diào)用 類實例屬性 和 類實例方法蒜撮。
4.不同點:
- 類方法 在調(diào)用時會隱式傳遞類型作為第一個參數(shù);而 類靜態(tài)方法 不會隱式傳遞任何值跪呈。
- 類方法 的方法體中可以通過傳遞進來的類型實參調(diào)用該類型的 類屬性 和 類方法段磨;而 類靜態(tài)方法 內(nèi)部不知道任何關(guān)于類型或者類實例的信息,** 但是可以通過類型本身的類型全名調(diào)用 類屬性 和 類方法耗绿。**
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
# 通過類靜態(tài)方法獲取類實例
print isinstance(DerivedA.instance_factory_staticmethod(1), DerivedA)
# 通過類方法后去類實例
print isinstance(DerivedB.instance_factory_classmethod(1), DerivedB)
運行結(jié)果:
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