python - 关于 python MRO 以及 super() 的行为

标签 python class python-2.7 super method-resolution-order

今天我想弄清楚如何__mro__和 python 中的 super 作品一样,我发现了一些对我来说既有趣又奇怪的东西,因为我在阅读 __mro__ 后得到了一些我不理解的东西。 。这是代码片段。

代码片段1:

#!/usr/bin/pyhon

class A(object):
    def test(self):
        return 'A'

class B(A):
    def test(self):
        return 'B to %s' % super(B, self).test()

class C(A):
    def test(self):
        return 'C'

class D(B, C):
    pass

print D().test()

输出:

 B to C

代码片段2:当我更新B类内部的 super 时:

#!/usr/bin/pyhon

class A(object):
    def test(self):
        return 'A'

class B(A):
    def test(self):
        return 'B to %s' % super(C, self).test()

class C(A):
    def test(self):
        return 'C'

class D(B, C):
    pass

print D().test()

输出:

B to A

然后现在我得到了我之前所期望的。有人可以解释一下 mro 如何与 super 一起使用吗?

最佳答案

D 的 MRO 是 [D, B, C, A, 对象]。

super(C, self) 〜A

super(B, self) 〜C

super(MyClass, self)不是关于“MyClass的基类”,而是关于MyClass的MRO列表中的下一个类。 .

正如评论中所述,super(…)实际上并不返回 MRO 中的下一个类,而是将调用委托(delegate)给它。

关于python - 关于 python MRO 以及 super() 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20545791/

相关文章:

python - 在 python 中访问 SimpleDB 的最佳模块是什么?

python - 如何使用 h5py 读取只有数据集(没有组)的 HDF5 文件?

python - 如何提取数据框中的年和周数并将其放入新列python

python - 在 NLTK 中使用斯坦福 NER 标记器提取人员和组织列表

python - NLTK 词干产生奇怪的结果

c++ - 如何用这个亲属构造对象

传递变量时的 C# 构造函数设计可能是两种类型之一

python - 关于在 Python 中生成一个好的 JSON 字符串

Python 请求向 HTTP GET 添加额外的 header