跳到主要内容

Python 多重继承

提示
  1. Python多重继承:在Python中,一个类可以从多个超类派生,允许它继承多个超类的特性和方法。
  2. 多级继承的实现:除了多重继承,Python还支持多级继承,即一个类可以从另一个已经派生的类派生,实现更复杂的继承结构。
  3. 方法解析顺序(MRO):当多个超类有相同的方法时,Python使用方法解析顺序来确定调用哪个超类的方法,通常是从左到右的顺序。

在Python中,一个可以从多个超类派生。这称为多重继承

例如,类Bat从超类MammalWingedAnimal派生。这是有道理的,因为蝙蝠既是哺乳动物也是有翼动物。

多重继承

Python多重继承语法

class SuperClass1:
# SuperClass1的特性
class SuperClass2:
# SuperClass2的特性
class MultiDerived(SuperClass1, SuperClass2):
# SuperClass1 + SuperClass2 + MultiDerived类的特性

这里,MultiDerived类派生自SuperClass1SuperClass2类。

示例:Python多重继承

class Mammal:
def mammal_info(self):
print("哺乳动物可以直接生育。")

class WingedAnimal:
def winged_animal_info(self):
print("有翼动物可以挥动翅膀。")

class Bat(Mammal, WingedAnimal):
pass

# 创建一个Bat类的对象
b1 = Bat()

b1.mammal_info()
b1.winged_animal_info()

输出

哺乳动物可以直接生育。
有翼动物可以挥动翅膀。

在上面的例子中,Bat类从两个超类派生:Mammal和WingedAnimal。注意以下语句,

b1 = Bat()
b1.mammal_info()
b1.winged_animal_info()

这里,我们使用b1(Bat的对象)来访问Mammal和WingedAnimal类的mammal_info()winged_animal_info()方法。

Python多级继承

在Python中,不仅可以从超类派生一个类,还可以从派生类派生一个类。这种继承形式被称为多级继承

以下是多级继承的语法,

class SuperClass:
# 超类代码在这里
class DerivedClass1(SuperClass):
# 派生类1的代码在这里
class DerivedClass2(DerivedClass1):
# 派生类2的代码在这里

这里,DerivedClass1类派生自SuperClass类,而DerivedClass2类派生自DerivedClass1类。

Python中的多级继承

示例:Python多级继承

class SuperClass:

def super_method(self):
print("超类方法被调用")

# 定义从SuperClass派生的类
class DerivedClass1(SuperClass):
def derived1_method(self):
print("派生类1方法被调用")

# 定义从DerivedClass1派生的类
class DerivedClass2(DerivedClass1):

def derived2_method(self):
print("派生类2方法被调用")

# 创建DerivedClass2的一个对象
d2 = DerivedClass2()

d2.super_method() # 输出:"超类方法被调用"

d2.derived1_method() # 输出:"派生类1方法被调用"

d2.derived2_method() # 输出:"派生类2方法被调用"

输出

超类方法被调用
派生类1方法被调用
派生类2方法被调用

在上面的例子中,DerivedClass2从DerivedClass1派生,而DerivedClass1从SuperClass派生。

这意味着DerivedClass2继承了DerivedClass1和SuperClass的所有属性和方法。

因此,我们使用d2(DerivedClass2的对象)来调用SuperClass、DerivedClass1和DerivedClass2的方法。

Python中的方法解析顺序(MRO)

如果两个超类具有相同的方法名,而派生类调用该方法时,Python使用MRO来

搜索要调用的正确方法。例如,

class SuperClass1:
def info(self):
print("超类1方法被调用")

class SuperClass2:
def info(self):
print("超类2方法被调用")

class Derived(SuperClass1, SuperClass2):
pass

d1 = Derived()
d1.info()

# 输出:"超类1方法被调用"

这里,SuperClass1和SuperClass2这两个类都定义了一个方法info()

因此,使用Derived类的d1对象调用info()时,Python使用MRO来决定调用哪个方法。

在这种情况下,MRO规定应该首先从最左边的超类继承方法,因此调用的是SuperClass1的info()而不是SuperClass2的。