博客
关于我
Pyhton 类继承之 self.method() 的方法解析顺序
阅读量:708 次
发布时间:2019-03-21

本文共 1092 字,大约阅读时间需要 3 分钟。

对于如下的继承关系,Class MyClass 的对象调用的方法 display 在 Class Base 和 Class B 中都存在,实际调用的是哪一个?

可见,类的继承关系构建如下:

Base   /  \  A    B/MyClass

分析类的MRO(Method Resolution Order)可以更清晰地理解问题。当分别查看obj.display()的执行流程时,结果表明最终执行的是Class Base的display方法,而不是Class B的display方法。具体分析如下:

  • 类继承关系解析:

    • MyClass直接继承自A和B。
    • 但是,根据MRO输出,MyClass的MRO顺序被确定为:[<class 'main.MyClass'>, <class 'main.A'>, <class 'main.Base'>, <class 'main.B'>, <type 'object'>]。
    • 这表明,在Python中,MyClass继承自A和B的同时,Base类在A和B的继承链中存在。这可能是因为Base类同时是A和B的基类,或者是通过多个中间类间接继承而来的。
  • display方法的查找规则:

    • 在Python中,方法调用的查找遵循以下规则:
      • 首先查找当前类的方法。
      • 如果找不到,再沿着继承链向上查找。
      • 如果在基类中找到方法,且该方法存在于基类中,那么基类的方法会优先被调用。
    • 在本例中,尽管B类具有自己的display方法,却未被调用,因为在MRO中,Base类的display方法被检查并优先于B类的方法被使用。
  • 实际调用的原因:

    • 当调用MyClass的display方法时,Python首先查找MyClass的display方法。
    • 如果不存在,则查找A类中的display方法。
      • 在本例中,A类并没有定义display方法,因此继续查找。
    • 最终,沿着MRO继续查找,Base类的display方法存在并被调用。
    • 因此,尽管B类也有display方法,Base类的方法会被优先调用。
  • 结论:在上述继承关系中,MyClass对象调用display方法时,实际调用的是Class Base中的display方法,而不是Class B中的display方法。这是因为Python的MRO机制将Base类作为B类和A类的共同基类,并在查找过程中优先考虑Base类的方法。

    这个现象表明,在多层继承关系中,理解类的MRO非常重要,因为它直接影响方法的查找和调用结果。虽然B类也有display方法,但Base类的方法会被优先选用,除非在更具体的子类中重新定义了该方法。

    转载地址:http://dgwrz.baihongyu.com/

    你可能感兴趣的文章
    Python和RF编写web自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
    查看>>
    python命名空间更改_Python模块xml.etree.ElementTree自动修改xml命名空间键
    查看>>
    Python命名中尾随下划线有什么好处?
    查看>>
    Python启动脚本
    查看>>
    Python听写汇总结果
    查看>>
    python吊打Excel?屁!那是你不会用!
    查看>>
    Python合并两张图片 | 先叠透明度再合并 (附Demo)
    查看>>
    python各进制的表述与转换
    查看>>
    python各种库安装
    查看>>
    python可视化matplotlib_如何使用Python中最强大的可视化工具Matplotlib?
    查看>>
    python可维护性_使用这7大神器,让你的Python 代码更容易于维护
    查看>>
    Python只运行一次while循环
    查看>>
    python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
    查看>>
    Python变量命名方法-ChatGPT4o作答
    查看>>
    Python变量与运算符
    查看>>
    Python变量/运算符/函数/模块/string
    查看>>
    python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法
    查看>>