【python】类的继承、多继承、重写、同名方法调用、super()

发布时间:2024年01月18日

一、简单继承

class Parent:
    pass

class Child(Parent):
    pass

二、父类属性调用与方法重写

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("Animal speaks")

class Dog(Animal):
    def speak(self):  # 直接覆盖父类
        print("Dog speaks")
        print(f"{self.name} speaks") # 父类属性调用


d = Dog("ali")
d.speak()
# Dog speaks
# ali speaks

在子类中可以重写父类的所有方法,当然也包括__init__()方法。

三、多继承与父类同名方法调用

class Parent1:
    def method(self):
        print("Parent1's method")

class Parent2:
    def method(self):
        print("Parent2's method")

class Child(Parent1, Parent2):
    def call_methods(self):
        # 调用 Parent1 的 method() 
        # 为什么是Parent1是基于C3算法
        super().method()
        # 直接调用 Parent2 的 method()
        # 个人觉得这个写法好,逻辑明了
        Parent2.method(self)

child = Child()
child.call_methods()

在多继承中,当继承的父类中都有一个名字相同的方法,当子类实例调用这个方法时,使用的是方法解析顺序(Method Resolution Order,MRO)。

方法解析顺序是一种确定多继承中属性和方法搜索顺序的算法。在 Python 中,方法解析顺序是通过 C3 算法来计算的。该算法会按照深度优先搜索(DFS)的顺序,从左到右查找继承树中的属性和方法。

对于一个继承了多个父类的子类,其方法解析顺序可以通过__mro__属性获取。
例如,在上面的例子中,我们可以通过以下代码获取 Child类的方法解析顺序:

print(Child.__mro__)

输出结果为:

(<class '__main__.Child'>, <class '__main__.Parent1'>, <class '__main__.Parent2'>, <class 'object'>)

这表明在调用 Child类的方法时,会按照 <class ‘main.Child’>, <class ‘main.Parent1’>, <class ‘main.Parent2’> 和 <class ‘object’> 的顺序依次查找。

如果多个父类中存在相同的方法名,则会按照方法解析顺序,依次从左到右查找,直到找到第一个匹配的方法为止。如果在所有父类中都找不到匹配的方法,则会抛出 AttributeError 异常。

四、关于super()

super() 函数用于在子类中调用父类的方法。

使用 super() 的一种常见方式是在子类的方法中调用父类的同名方法。通过使用 super().method_name(),可以保证调用的是父类的方法而不是子类的重写方法。

class ParentClass:
    def method(self):
        print("ParentClass method")

class ChildClass(ParentClass):
    def method(self):
        super().method()  # 调用父类的 method 方法
        print("ChildClass method")

# 创建一个 ChildClass 类的实例
child = ChildClass()
child.method()
# ParentClass method
# ChildClass method

在这个例子中,子类 ChildClass 继承了父类 ParentClass 的方法 method。在子类的 method 方法中,我们通过 super().method() 调用了父类的 method 方法,并在之后添加了子类特定的逻辑。

需要注意的是,super() 函数只能用于新式类(继承自 object 或其他新式类的类),而对于旧式类则无法使用。在 Python 3 中,默认情况下所有的类都是新式类,所以 super() 可以广泛使用。

使用 super() 的优点包括:

  • 可以确保父类的方法被正确地调用,避免重复编写相同的代码。
  • 保持了继承链的一致性,即使父类发生变化,子类也能够正确地继承和使用父类的功能。
  • super() 确保了父类方法的正常执行顺序,并且能够让你的代码更加易于维护和扩展。然而,如果你需要完全重新定义父类方法的逻辑,那么直接在子类中重写方法可能更为简单和直观。

然而,并非所有情况下都需要使用 super()。以下是一些情况下可能不需要使用 super() 的例子:

  • 当子类不需要对父类的方法进行修改或扩展时,可以直接调用父类的方法。
  • 当子类覆盖了父类的方法,并完全重写了该方法的逻辑时,不需要使用
    super(),直接重写方法即可。

如有错误欢迎评论指正,
如有问题欢迎评论提问。

文章来源:https://blog.csdn.net/Lucifer721/article/details/135643832
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。