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()
添加到Base1
和Base2
,我会收到错误AttributeError: 'super' object has no attribute 'display'
。
怎么了?
【问题讨论】:
您希望这能做什么?您的预期输出是什么? 【参考方案1】:Base1
和 Base2
类隐式继承自 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 慢速前进和后退运动[重复]
在(后退按钮、前进按钮、关闭选项卡/浏览器)上运行最后一个 Ajax 请求 [重复]