Python - 实例方法中的多态性与静态方法中的多态性

问题描述 投票:0回答:1

实例方法和静态方法之间有什么实际区别,因为这两个代码返回相同的结果?我知道静态方法不能对“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"

如何检查实例方法真正的多态性?也许我对多态性的整个概念理解错误?

python polymorphism static-methods instance-methods
1个回答
0
投票

与任何编程语言一样,您只需用该语言编写代码即可确定其行为:

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
中选择的。

© www.soinside.com 2019 - 2024. All rights reserved.