栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python

Guido自己在他的博客文章

Method Resolution Order
(包括两次较早的尝试)中对此进行了合理的详细说明。

在你的示例中,Third()将调用

First.__init__
。Python从左到右列出,在类的父级中查找每个属性。在这种情况下,我们正在寻找
__init__
。所以,如果你定义

class Third(First, Second):    ...

Python将首先查看First,如果First没有该属性,则它将查看Second。

当继承开始跨越路径时(例如,如果First继承自Second),这种情况会变得更加复杂。阅读上面的链接以获取更多详细信息,但是简而言之,Python将尝试维护每个类从子类本身开始在继承列表上出现的顺序。

因此,例如,如果你有:

class First(object):    def __init__(self):        print "first"class Second(First):    def __init__(self):        print "second"class Third(First):    def __init__(self):        print "third"class Fourth(Second, Third):    def __init__(self):        super(Fourth, self).__init__()        print "that's it"MRO将是 [Fourth, Second, Third, First].

顺便说一句:如果Python无法找到一致的方法解析顺序,它将引发异常,而不是退回到可能使用户感到惊讶的行为。

编辑以添加一个模棱两可的MRO的示例:

class First(object):    def __init__(self):        print "first"class Second(First):    def __init__(self):        print "second"class Third(First, Second):    def __init__(self):        print "third"

是否应Third的MRO是

[First, Second]
[Second, First]
?没有明显的期望,Python会引发错误:

TypeError: Error when calling the metaclass bases    Cannot create a consistent method resolution order (MRO) for bases Second, First

编辑:我看到几个人争辩说上面的示例缺少

super()
调用,所以让我解释一下:这些示例的重点是说明MRO的构造方式。它们不打算打印“第一第二第三”或其他内容。你可以并且应该当然使用该示例,添加
super()
调用,看看会发生什么,并且对Python的继承模型有更深入的了解。但我的目标是保持简单,并说明MRO的构建方式。正如我所解释的那样:

>>> Fourth.__mro__(<class '__main__.Fourth'>, <class '__main__.Second'>, <class '__main__.Third'>, <class '__main__.First'>, <type 'object'>)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/371835.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号