【问题标题】:Python multi-inheritance. Is this a bug?Python 多继承。这是一个错误吗?
【发布时间】:2021-10-23 14:50:44
【问题描述】:

在下面的示例中,我希望看到:

CarChild1
CarChild2

但它会打印:

CarChild1
CarChild1

场景是我有一个继承了 2 个类的类。 它需要按正确的顺序调用两个父类的run()函数,但由于某种原因,它只调用了第一个父类的函数。

下面的示例代码说明了这个问题:

class CarChild1:
    def run(self):
        self._print_name()

    def _print_name(self):
        print('CarChild1')

class CarChild2:
    def run(self):
        self._print_name()

    def _print_name(self):
        print('CarChild2')

class CarChild3(CarChild1, CarChild2):
    def run(self):
        CarChild1.run(self)
        CarChild2.run(self)

carChild3 = CarChild3()
carChild3.run()

【问题讨论】:

  • 如果你特别希望CarChild2使用CarChild2中声明的print_name方法,你可以调用CarChild2._print_name(self)
  • 如何在不更改所有单个类的情况下解决此问题?

标签: python python-3.x multiple-inheritance


【解决方案1】:

您对self._print_name() 的调用将根据其类层次结构调用对象的_print_name 方法,不一定是在您调用它的同一类中定义的方法。

如果您特别希望CarChild2 使用在CarChild2 中声明的_print_name 方法,您可以调用CarChild2._print_name(self)。或者,您可以为不同的 _print_name 方法命名,因为您希望它们独立工作。

或者如果你调用你的打印方法__print_name(带有双下划线前缀)而不是_print_name,那么Python将在内部改变它们的名字,以便在每个类中调用正确的名字并且不能*在它之外调用。 (这些方法基本上是类私有的。)

* 他们可以,但只能通过名称修改机制来解决

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2017-03-15
    • 2021-02-14
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多