我在这里查看了有关 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 中出现在提供的类之后的那些条目。
我仍然觉得解释有点难以理解。这可能是重复的,类似的问题已经被问过很多次了,但是如果我理解了这一点,我可能能够更好地理解其他问题。