Python多重继承——父类A的方法可以调用父类B的方法吗?

时间:2021-06-09 07:06:23

标签: python

我对 Python 多重继承感到困惑。以下面的代码为例,我不认为它可以工作,但实际上,它可以工作。

我不明白的是为什么A类的say_hello()能够调用B类的say_byebye()方法?就因为两者都是C类的父类?

class A:
    def say_hello(self):
        print('Hello')
        self.say_byebye()

class B:
    def say_byebye(self):
        print('ByeBye')

class C(A, B):
    def say_something(self):
        self.say_hello()

if __name__ == '__main__':
    ins = C()
    ins.say_something()

而且,这是一种好的 Python OO 编程风格吗?

1 个答案:

答案 0 :(得分:0)

Python classes 不是自包含实体,它们是一组单独的实体 - 主要是方法,还有属性等 - 以及一些元数据 - 例如类名和基类。值得注意的是,这个组只是行为就像通常理解的类使用时;该组本身是惰性的,不会急切地检查一致性或正确性。

具体来说,类上的方法只是函数。与任何函数一样,方法在定义时不会急切地检查它们的依赖项是否存在。

def say_hello():
    print('Hello')
    say_byebye()  # say_byebye does not exist at definition time

def say_byebye():
    print('ByeBye')

say_hello()       # works, say_byebye exists at usage time

同样,方法不会急切地检查 self(或任何其他参数)是否具有该方法所需的方法/属性。这使得在不完整或抽象类中定义一个方法但在派生的完整类中使用方法是很好的。


一般来说,类应该是自包含的和功能性的——依赖子类或多重继承来实现完整性通常不是很好的做法,因为从类本身来看这并不明显。但是,mixins 的模式使用这种样式,将类命名为 Mixin<XYZ> 通常会传达功能需要(多重)继承。

为确保分部类不被误用并明确指出缺少哪些部分,建议将它们定义为 abstract base classes。弱形式仅定义 raise NotImplementedError 的方法,而强形式使用 abc module 来强制执行契约。

from abc import ABCMeta, abstractmethod

class A(metaclass=ABCMeta):
    def say_hello(self):
        print('Hello')
        self.say_byebye()

    # an `abstractmethod` must be overwritten to instantiate an ABCMeta class
    @abstractmethod
    def say_byebye(self):
        raise NotImplementedError