实例方法和静态方法之间有什么实际区别,因为这两个代码返回相同的结果?我知道静态方法不能对“self”进行操作,也不能直接访问属性,但是如何验证实例方法是否真正被重写(真正的多态性),而静态方法则不然?
class BaseClass:
def instance_method(self):
return "Instance method of base class"
@staticmethod
def static_method():
return "Static method of base class"
class DerivedClass(BaseClass):
def instance_method(self):
return "Instance method of derived class"
@staticmethod
def static_method():
return "Static method of derived class"
base_object = BaseClass()
derived_object = DerivedClass()
print(base_object.instance_method()) # Displays: "Instance method of base class"
print(derived_object.instance_method()) # Displays: "Instance method of derived class"
print(BaseClass.static_method()) # Displays: "Static method of base class"
print(DerivedClass.static_method()) # Displays: "Static method of derived class"
print(base_object.static_method()) # Displays: "Static method of base class"
print(derived_object.static_method()) # Displays: "Static method of derived class"
如何检查实例方法真正的多态性?也许我对多态性的整个概念理解错误?
与任何编程语言一样,您只需用该语言编写代码即可确定其行为:
class BaseClass:
def instance_method(self):
return "Instance method of base class"
@staticmethod
def static_method():
return "Static method of base class"
def normal_base_method(self):
return self.static_method() + " called from normal_base_method"
class DerivedClass(BaseClass):
def instance_method(self):
return "Instance method of derived class"
@staticmethod
def static_method():
return "Static method of derived class"
base_object = BaseClass()
derived_object = DerivedClass()
print(base_object.normal_base_method())
print(derived_object.normal_base_method())
输出:
Static method of base class called from normal_base_method
Static method of derived class called from normal_base_method
上面的输出显示,调用仅在基类中定义的方法会更改行为,因为该实例属于派生类。
调用
derived_object.normal_base_method()
确实调用了BaseClass.normal_base_method
,但是因为self
引用了derived_object
,所以static_method
是从DerivedClass
中选择的。