Python方法解析顺序 [英] Python Method Resolution Order

查看:0
本文介绍了Python方法解析顺序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谁能解释一下给定代码的输出,以及在这种情况下python MRO是如何工作的?

class A(object):
    def go(self):
        print("go A go!")


class B(A):
    def go(self):
        super(B, self).go()
        print("go B go!")


class C(A):
    def go(self):
        super(C, self).go()
        print("go C go!")


class D(C, B):
    def go(self):
        super(D, self).go()
        print("go D go!")


d = D()
d.go()

输出:

go A go!
go B go!
go C go!
go D go!

按照从左到右和深度,我认为应该是:

go A go!
go C go!
go D go!

但它似乎不像我想象的那样工作。

推荐答案

类的MRO基于其父级的MRO:

>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

three rules为:

  1. 孩子先于父母:
  • 对象
  • B<;A
  • C<;A
  • D<;C
  • D<;B
  1. 家长按基数顺序排列:
  • C<;B
  1. 合并父级MRO,保留其顺序。
  • 合并B < A < objectC < A < object

在Python2的早期,搜索规则是Depth-First-Left-Ot-Right,但随着对C3线性化算法的研究,这种情况发生了变化。

有关在实际代码中利用此算法的方法,请参阅Super Considered Super博客文章。

这篇关于Python方法解析顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆