Python super()链不前进[重复]

Posted

技术标签:

【中文标题】Python super()链不前进[重复]【英文标题】:Python super() chain not advancing [duplicate] 【发布时间】:2016-04-25 05:56:31 【问题描述】:

这里是 Python 新手,希望对多重继承有所帮助!

考虑以下类层次结构:

class Base1:
    def display(self):
        print('Base1')

class Base2:
    def display(self):
        print('Base2')

class Derived1 (Base1):
    def display(self):
        super().display()
        print('Derived1')

class Derived2 (Base2):
    def display(self):
        super().display()
        print('Derived2')

class Derived (Derived1, Derived2):
    def display(self):
        super().display()
        print('Derived')

Derived().display()

我希望它的输出会打印层次结构中涉及的所有类的名称,但事实并非如此。此外,如果我将super().display() 添加到Base1Base2,我会收到错误AttributeError: 'super' object has no attribute 'display'

怎么了?

【问题讨论】:

您希望这能做什么?您的预期输出是什么? 【参考方案1】:

Base1Base2 类隐式继承自 object,后者没有 display 方法。这解释了AttributeError: 'super' object has no attribute 'display' 异常。

这段代码的输出应该是:

Base1
Derived1
Derived

从多个类继承时,在调用super 时从左到右搜索属性。因此,display 位于 Derived1 上,因此在方法解析期间不会查看 Derived2。请参阅this question 了解更多信息。

【讨论】:

谢谢。这是否意味着必须“关闭”继承循环才能让super() 调用所有类的方法?在这种情况下,这是否意味着我将display() 添加到object 呃,向object 添加方法可能不推荐。从头开始创建自己的对象可能会更好,基础对象具有display 方法。没有真实的代码示例很难说。请记住,很多东西都继承自 object(即所有非原语),因此您真的不想对其进行修补,因为它可能会导致无法预料的后果。 对我来说重要的一点是 super() 不能出现在根类中。

以上是关于Python super()链不前进[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MPMoviePlayerController 慢速前进和后退运动[重复]

Swift:在锁定屏幕上添加前进/后退 15 秒按钮

在(后退按钮、前进按钮、关闭选项卡/浏览器)上运行最后一个 Ajax 请求 [重复]

jQuery Raty 在使用浏览器的导航来回前进时重复星星

反应分页按钮前进和后退python

uniquefu Python+Selenium学习--前进和后退