CodeGym /课程 /Python SELF ZH /多重继承

多重继承

Python SELF ZH
第 16 级 , 课程 4
可用

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 类继承自 Base1Base2。当调用 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 在父类中寻找字段和方法的顺序。这正是你将在下一课中学到的。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION