一、super()函数的基本用法
Python中的super()函数用于在子类中调用父类的方法,可以省略参数,也可以接受两个参数:子类和子类对象。使用super()函数调用父类方法的好处是可以避免硬编码,使得代码更加灵活。下面是一个简单的示例代码:
class Parent: def __init__(self, name): self.name = name def hello(self): print("Hello, " + self.name + "!") class Child(Parent): def __init__(self, name, age): super().__init__(name) self.age = age def hello(self): super().hello() print("I am " + str(self.age) + " years old.") c = Child("Tom", 5) c.hello()
运行结果:
Hello, Tom! I am 5 years old.
在上面的代码中,子类Child继承自父类Parent,并重写了hello方法。在hello方法中,我们使用了super()函数来调用父类的hello方法,使得子类的实例c同时具有了父类和子类的特性。
二、super()函数的多重继承
Python中的super()函数在多重继承的场景下,更加能体现它的神奇作用。假设我们有一个基础的类Animal,还有两个类Dog和Bird,它们都继承自Animal类,并且都有自己的方法。现在我们希望创建一个类狗鸟DogBird,让它同时具有Dog和Bird的特性。下面是一个示例代码:
class Animal: def __init__(self, name): self.name = name def move(self): print(self.name + " is moving.") class Dog(Animal): def __init__(self, name): super().__init__(name) def bark(self): print(self.name + " is barking.") class Bird(Animal): def __init__(self, name): super().__init__(name) def fly(self): print(self.name + " is flying.") class DogBird(Dog, Bird): def __init__(self, name): super().__init__(name) db = DogBird("Ginger") db.move() db.bark() db.fly()
运行结果:
Ginger is moving. Ginger is barking. Ginger is flying.
在上面的代码中,我们定义了一个类DogBird,这个类继承自Dog和Bird两个类,并且都实现了它们的方法。在这里,我们只需要调用super()函数,就可以一次性调用它们对应的父类方法。这样,在多重继承的场景下,我们就能够方便地实现代码的复用和灵活性。
三、super()函数与MRO算法
Python中的super()函数还与MRO算法有着密切的关系。MRO全称为Method Resolution Order,它决定了在多重继承的情况下,Python中的类方法会按照什么样的顺序被解析执行。具体来说,MRO算法的执行顺序是广度优先搜索。
举个例子,假设我们有一个类D,它继承自B和C两个类,而类B和类C又继承自A类。下面是一个示例代码:
class A: def __init__(self): print("Init A.") class B(A): def __init__(self): super().__init__() print("Init B.") class C(A): def __init__(self): super().__init__() print("Init C.") class D(B, C): def __init__(self): super().__init__() print("Init D.") d = D()
运行结果:
Init A. Init C. Init B. Init D.
在上面的代码中,我们定义了类A、类B、类C和类D,它们之间的继承关系如下图所示:
在类D中,我们使用了super()函数来调用父类的构造方法。MRO算法的执行顺序是先广度后深度,所以父类构造方法的执行顺序便是A、C、B、D。通过MRO算法和super()函数,我们就可以轻松地实现Python中复杂的多重继承。