【发布时间】:2013-09-11 00:35:31
【问题描述】:
我在这里查看了有关 python 的 super() 方法的其他问题,但我仍然发现很难理解整个概念。
我也在看pro python书中的例子
那里引用的例子是
class A(object):
def test(self):
return 'A'
class B(A):
def test(self):
return 'B-->' + super(B, self).test()
class C(A):
def test(self):
return 'C'
class D(B, C):
pass
>>> A().test()
'A'
>>> B().test()
'B-->A'
>>> C().test()
'C'
>>> D().test()
'B-->C'
>>> A.__mro__
(__main__.A, object)
>>> B.__mro__
(__main__.B, __main__.A, object)
>>> C.__mro__
(__main__.C, __main__.A, object)
>>> D.__mro__
(__main__.D, __main__.B, __main__.C, __main__.A, object)
为什么做 D().test() 我们得到的输出是 'B-->C' 而不是 'B-->A'
书中的解释是
在最常见的情况下,包括此处显示的用法,super() 接受两个参数: 类和该类的实例。正如我们这里的示例所示,实例对象确定 哪个 MRO 将用于解析结果对象的任何属性。提供的类确定 该 MRO 的子集,因为 super() 仅使用 MRO 中出现在类之后的那些条目 提供。
我仍然觉得解释有点难以理解。这可能是重复的,类似的问题已经被问过很多次了,但是如果我理解了这一点,我可能能够更好地理解其他问题。
Understanding Python super() with __init__() methods
What does 'super' do in Python?
【问题讨论】:
-
您是否想了解 (1) 确定顺序的规则是什么,(2) 为什么要发明该规则,或者 (3) 为什么 Python 选择该规则而不是替代规则?
-
我现在知道 [1],还在寻找 [2] 和 [3]。