10.1 从多个类继承
多重继承在 Python 中允许一个类继承 属性和方法来自多个父类。这提供了更大的灵活性并允许代码重用,但也可能 导致复杂的层次结构和潜在的冲突。
为你的类指定五个父类的可能性大大扩展了你的 功能,并且使编写代码非常方便。实现起来非常 简单——只需要通过逗号列出父类:
class Base1:
def method1(self):
print("Method1 from Base1")
class Base2:
def method2(self):
print("Method2 from Base2")
class Derived(Base1, Base2):
pass
obj = Derived()
obj.method1()
obj.method2()
一切都和计划的一样——完美。
然而,多重继承有几个复杂的方面,在使用它时 一定要考虑。让我们来看看它是如何工作的以及如何避免与多重 继承相关的问题。
10.2 调用多个基类中都有的方法
一个类可以从多个父类中继承属性和方法,列在类名后面的括号中。而这些属性和方法 可能具有相同的名称:
class Base1:
def method(self):
print("Method from Base1")
class Base2:
def method(self):
print("Method from Base2")
class Derived(Base1, Base2):
pass
obj = Derived()
obj.method() # 哪个方法被调用?
在这个例子中,Derived
类继承自
Base1
和 Base2
。当调用
method()
时,Python会选择第一个指定类的 方法—
Base1
。
但这并不明显,对吧?如果有人更改了基类的代码, 整个应用程序的逻辑可能会受到影响,而你甚至不知道有什么问题。只是开始调用稍微不正确的方法:)
10.3 使用 super()
进行多重继承
另一个有趣的特点是调用 super()
进行多重
继承时调用基类。
例子:
class Base1:
def method(self):
print("Method from Base1")
super().method()
class Base2:
def method(self):
print("Method from Base2")
super().method()
class Derived(Base1, Base2):
def method(self):
print("Method from Derived")
super().method()
obj = Derived()
obj.method()
那么?屏幕上会打印出什么?
Method from Derived
Method from Base1
或者
Method from Derived
Method from Base2
我有一个惊喜给你——输出将是:
Method from Derived
Method from Base1
Method from Base2
代码 super().method()
将会调用每个基类的
method()
方法!这正是我第一次提到多重
继承时所说的那些细节。
10.4 菱形(Diamond)
继承
最后,经典的菱形继承问题。通过例子而不是描述来展示它更容易:
用代码表示可能看起来像这样:
class A:
def method(self):
print("Method from A")
class B(A):
def method(self):
print("Method from B")
super().method()
class C(A):
def method(self):
print("Method from C")
super().method()
class D(B, C):
def method(self):
print("Method from D")
super().method()
obj = D()
obj.method()
输出将是:
Method from D
Method from B
Method from C
Method from A
要在多重继承中找到方向,你需要 清楚知道 Python 在父类中寻找字段和方法的顺序。这正是你将在下一课中学到的。
GO TO FULL VERSION