首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么当一个子类继承/不继承Python中的第三个类时,这个类的MRO会发生变化?

当一个子类继承或不继承Python中的第三个类时,这个类的MRO(Method Resolution Order,方法解析顺序)会发生变化的原因是因为MRO是根据类的继承顺序来确定方法调用的顺序。

在Python中,当一个类被定义时,它会继承自一个或多个父类。当调用一个方法时,Python会按照特定的顺序搜索方法的定义,这个顺序就是MRO。MRO的搜索顺序是通过C3线性化算法来确定的。

当一个子类继承一个父类时,子类的MRO会首先包含子类自身,然后按照继承顺序依次包含父类和祖先类。这样,在方法调用时,Python会按照MRO的顺序搜索方法的定义,直到找到匹配的方法或者搜索完所有的类。

当一个子类不继承某个父类时,这个父类就不会出现在子类的MRO中。这样,在方法调用时,Python会跳过这个父类,直接搜索下一个类的方法定义。

继承和不继承第三个类会改变类的继承顺序,从而影响MRO。这可能会导致方法调用的顺序发生变化,从而影响程序的行为。

需要注意的是,MRO的变化可能会导致方法的重写行为发生变化,因为子类可能会覆盖父类的方法定义。此外,MRO的变化还可能会影响多重继承时方法的调用顺序。

总结起来,当一个子类继承或不继承Python中的第三个类时,这个类的MRO会发生变化,因为MRO是根据类的继承顺序来确定方法调用的顺序。这可能会影响方法的搜索顺序和重写行为。

相关搜索:为什么Python子类不继承父类的注释?为什么我的子类在Javascript中不继承父类的属性?为什么我的类不继承基类中定义的方法?为什么在使用继承的类中没有设置这个变量?为什么enumerable: false不级联到TypeScript中的继承类?当继承的类中没有构造函数时,如何抛出异常?当涉及Ruby中的类方法时,继承是如何工作的?为什么我更喜欢元类而不是继承Python中的超类NotImplementedError:在继承`Model`类的子类时,应实现一个`call`方法当继承类中的变量等于某个值时,如何运行方法?如果你从Swift中的NSObject继承,为什么一个类会变成公共的?具有新对象的父类,以及子类中的新对象,对象/方法继承Python当子类从父类继承时,有没有办法对继承的字段使用不同的数据类型来添加更多的功能?当使用方法从从selenium类继承的python Appium类中查找元素时,appium不会查找元素静态方法和继承:为什么一个类的静态属性的值会流向另一个类?'get_called类‘当KnownType类在另一个项目中时,是否接收从WCF服务继承的类?Java中的继承 - 创建子类的对象也会调用超类的构造函数.为什么呢?当有人在从抽象类继承的类的构造函数中调用super时,会发生什么?有没有办法让一个子类根据python中的输入从不同的父类继承?Python3.x:不继承地访问其他类中的self.xxx变量
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python之子类继承父类时进行初始化的一些问题

这是为什么呢? __init__相当于是python类的构造方法,在类进行实例化时被调用,当子类和父类中都存在构造方法时,子类中需要显示调用父类的构造方法 。...需要注意的是python中构造方法是不能进行重载的,当有多个构造方法存在时,会默认调用最后一个构造方法。...加上了私有的属性和方法不能在类外进行访问,同时,子类继承父类的属性和方法时,在子类中也不能够访问父类的私有属性和方法。...__init__() self.school = "一中" def printStudent(self): #子类自己继承了父类的公有属性,直接访问即可...还有一种方式就是通过在类内部再定义一个公有方法,来调用私有的属性或方法,在子类进行调用时调用这个公有的方法即可,这也就是面向对象中封装的作用之一,在接下来会结合进行介绍。

63550

Python 继承

应用场景 当 父类 的方法实现不能满足子类需求时,可以对方法进行 重写(override) ?...父类名.方法(self) 这种方式,目前在 Python 3.x 还支持这种方式 这种方法 不推荐使用,因为一旦 父类发生变化,方法调用位置的 类名 同样需要修改 提示 在开发时,父类名 和 super...Python 中的 MRO —— 方法搜索顺序 Python 中针对 类 提供了一个 内置属性 __mro__ 可以查看 方法 搜索顺序 MRO 是 method resolution order,主要用于...为基类的类,推荐使用 经典类:不以 object 为基类的类,不推荐使用 在 Python 3.x 中定义类时,如果没有指定父类,会 默认使用 object 作为该类的 基类 —— Python 3....x 中定义的类都是 新式类 在 Python 2.x 中定义类时,如果没有指定父类,则不会以 object 作为 基类 新式类 和 经典类 在多继承时 —— 会影响到方法的搜索顺序 为了保证编写的代码能够同时在

67950
  • Python super()方法、多继承以及MRO顺序

    因为super()方法如果多继承的话,会涉及到一个MRO(继承父类方法时的顺序表) 的调用排序问题。 下面可以打印一下看看单继承的MRO顺序(FatBoss.__mro__)。...方法,对父类的传参数,应该是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错 单继承时,使用super方法,则不能全部传递,只能传父类方法所需的参数,否则会报错 多继承时,相对于使用类名...为什么改变了 Parent.x 的值还会改变 Child2.x 的值,但是同时 Child1.x 值却没有改变? 这个答案的关键是,在 Python 中,类变量在内部是作为字典处理的。...因此,在父类中设置 x = 1 会使得类变量 x 在引用该类和其任何子类中的值为 1。这就是因为第一个 print 语句的输出是 1 1 1。...最后,如果该值在父类中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响到任何未重写该值的子类当中的值(在这个示例中被影响的子类是 Child2)。

    1.6K30

    Python - 面向对象编程 - super()

    p/15221352.html 多继承的详解:https://www.cnblogs.com/poloyy/p/15224912.html 为什么要用 super() 当子类重写了父类方法时,又想调用父类的同名方法时...,就需要用到 super() 什么是 super 在 Python 中,super 是一个特殊的类 super() 就是使用 super 类创建出来的对象 实际应用的场景:子类在重写父类方法时,调用父类方法...2.x 的时候,如果需要调用父类的方法,还可以用 父类名.方法(self) 这种方式,Python 3.x 还是支持的 不过不推荐,因为父类名发生变化的话,方法调用位置的类名也要同步修改 通过父类名调用父类方法...,是需要传 self 参数的哦 温馨提示 在开发时, 父类名.方法() , super().方法() 两种方式不要混用哈 灵魂拷问一:既然已经重写了子类的构造方法,为什么还要去调用 super?...其实 super() 并不一定调用父类的方法 super() 是根据类的 MRO 方法搜索顺序来决定调用谁的 super() 真正调用的是 MRO 中的下一个类,而不一定是父类 当然,这种情况只会出现在多继承

    33220

    Python面向对象特性 — 多继承【多继承顺序、新式类和经典类】

    一、Python中的MRO —— 方法搜索顺序【多继承顺序】 所谓方法搜索顺序,就是让某个对象调用某个方法时,python的解释器是按照什么样的顺序在创建这个对象的类,以及父类之间搜索方法的。...__mro__) 执行结果: 结果过程说明: 在控制台输出了一个元组。当让C类创建的对象方法时,Python解释器会首先在C类中查找有没有这个方法,如果有就会直接执行,而不会向后搜索。...如果没有找到就会按照从左向右的顺序继续向下寻找,在第三个类中A类中继续查找有没有提供这个方法,如果找到就执行,如果没有找到继续向后寻找下一个类object类,如果还没找到程序就会报错。...(在python3中object是所有类的基类,也就是只要定义一个类,这个类的最终基类都是object类,简单来讲object是python中所有类的祖宗类) 总结: 在搜索方法时,是按照__mro__...基于Python2.0 2.基于Python3.x 新式类和经典类在多继承时,会影响到方法的搜索顺序。

    54830

    Python多继承、super与MRO算法

    本文主要以Python3.x为例讲解Python多继承、super以及MRO算法。 1. Python中的继承 任何面向对象编程语言都会支持继承,Python也不例外。...相信继承的概念大家一定不会陌生。当类B从类A继承后,B类就会继承A类的所有非私有成员(由于Python没有私有成员的概念,所以B类就会继承A类的所有成员)。...这样回就会导致super(B,c)无法调用父类(A类)的构造方法,这就相当于一个空操作(什么都不会做),至于为什么会这样,后面讲MRO算法时就会一清二楚。 3....对于多继承来说,一个重要的问题就是:在多个父类拥有同名成员的情况下,在子类中访问该成员,到底是调用哪一个父类的成员呢? 毫无疑问,只有一个父类会为子类提供这个成员,也就是子类的亲爹。...其实Python编译器在解析类时,会将当前类的所有父类(包括直接和间接父类)按一定的规则进行排序,然后会根据super类构造方法的第一个参数的值决定使用哪一个父类。那么这个顺序是怎样的呢?

    53510

    Python中的继承

    python3x版本中只有一种类: python3中使⽤的都是新式类. 如果基类谁都不继承.....x 时,如果需要调用父类的方法,还可以使用以下方式: 父类名.方法(self) 这种方式,目前在 Python 3.x 还支持这种方式 这种方法 不推荐使用,因为一旦 父类发生变化,方法调用位置的 类名..._A__test() #不推荐使用 多继承 概念 子类 可以拥有 多个父类,并且具有 所有父类 的 属性 和 方法 例如:孩子 会继承自己 父亲 和 母亲 的 特性 图片 语法 class 子类名(...pass 问题的提出 如果 不同的父类 中存在 同名的方法,子类对象 在调用方法时,会调用 哪一个父类中的方法呢? 提示:开发时,应该尽量避免这种容易产生混淆的情况!...新式类的多继承 mro序列 MRO是一个有序列表L,在类被创建时就计算出来。

    72930

    8.python之面相对象part.3

    也就是说,当一个子类继承了一个父类的时候,子类或者是子类生成的对象,要找一个属性或者是一个方法,首先会在对象自己身上找,如果找不到,就回到这个对象所属的类中找,如果类中找不到,就会到这个类的父类中找,如果父类中也找不到...在python中,一个子类如果继承了多个父类,寻找属性和方法的方式有两种,分别是深度优先和广度优先。 当这个类是经典类时,多继承的情况下,会按照深度优先的方式进行查找。...当这个类是新式类时,多继承的情况下,会按照广度优先的方式进行查找。 上面这个深度优先的广度优先的图到底是什么意思呢?下面我来解释一下。...(为什么python3中所有的类都是新式类呢,就是因为你定义一个类,如果这个类不继承任何父类,默认就会继承object类) (重点)五.类继承的实现原理。 python内部是如何实现类继承的?...在python中定义的每一个类,python内部都会计算出一个方法解析的顺序,也就是一个mro列表,这个mro列表就是一个简单的,所有父类的顺序列表。 关于mro列表,可以看下面这个例子: #!

    39220

    python 多态和 super 用法

    python 中的多态实现非常简单,只要是在子类中实现和父类同名的方法,便能实现多态,如果想在子类中调用父类的方法,有多种方法,但是当涉及菱形继承等问题是,super 就成为了比较好的解决方案。...需要注意的是,两种方法都要传入 self,但是在子类中调用父类的 super 中传入的 self是子类对象。菱形继承当有多重继承,特别是菱形继承时,这两种方法就有区别了,示例如下。...为了弄清它的原理,我们需要花点时间解释下 python 是如何实现继承的。对于你定义的每一个类,python 会计算出一个所谓的方法解析顺序(MRO)列表。...我们不去深究这个算法的数学原理,它实际上就是合并所有父类的 MRO 列表并遵循如下三条准则:子类会先于父类被检查多个父类会根据它们在列表中的顺序被检查如果对下一个类存在两个合法的选择,选择第一个父类必须牢记...当使用 super() 函数时,python 会在 MRO 列表上继续搜索下一个类(这是一种嵌套实现)。

    12710

    【Python篇】Python 类和对象:详细讲解(中篇)

    9.1 为什么需要方法重写? 在继承中,子类会继承父类的所有方法和属性。然而,有时你可能希望子类的某些方法与父类的方法表现不同。这时,你就可以在子类中重写这些方法。...10.4 方法解析顺序(MRO) 当使用多继承时,Python 会根据方法解析顺序(MRO)来决定调用哪个父类的方法。MRO 是 Python 确定方法调用顺序的规则。...重写方法时,子类的方法会覆盖父类的同名方法,这是实现多态性的重要方式。 多继承:Python 支持一个类同时继承多个父类的属性和方法。...__.A'>, ] 13.3 复杂继承结构中的 MRO 当类层次结构变得复杂时,MRO 可以帮助你理解方法调用的顺序。...在这个例子中,Animal 是一个抽象类,它定义了一个抽象方法 sound。任何继承 Animal 的子类都必须实现 sound 方法,否则会引发错误。

    24110

    Python 类和对象:详细讲解中篇

    9.1 为什么需要方法重写? 在继承中,子类会继承父类的所有方法和属性。然而,有时你可能希望子类的某些方法与父类的方法表现不同。这时,你就可以在子类中重写这些方法。...10.4 方法解析顺序(MRO) 当使用多继承时,Python 会根据方法解析顺序(MRO)来决定调用哪个父类的方法。MRO 是 Python 确定方法调用顺序的规则。...重写方法时,子类的方法会覆盖父类的同名方法,这是实现多态性的重要方式。 多继承:Python 支持一个类同时继承多个父类的属性和方法。...__.A'>, ] 13.3 复杂继承结构中的 MRO 当类层次结构变得复杂时,MRO 可以帮助你理解方法调用的顺序。...在这个例子中,Animal 是一个抽象类,它定义了一个抽象方法 sound。任何继承 Animal 的子类都必须实现 sound 方法,否则会引发错误。

    11720

    Python 模块:abc

    模块abc提供了在 Python 中定义 抽象基类 (ABC) 的组件,在 PEP 3119 中已有概述。查看 PEP 文档了解为什么需要在 Python 中增加这个模块。...ABC 的类型仍然是 ABCMeta,因此继承 ABC 仍然需要关注元类使用中的注意事项,比如可能会导致元类冲突的多重继承。...你也可以将不相关的具体类(包括内建类)和抽象基类注册为“抽象子类” —— 这些类以及它们的子类会被内建函数 issubclass() 识别为对应的抽象基类的子类,但是该抽象基类不会出现在其 MRO(Method..._fdel)) 注解:与 Java 抽象方法不同,这些抽象方法可能有一个实现。这个实现可以通过 super()机制从重写它的类调用。这可以作为在使用协作的多重继承框架中的超类调用的终点。...()时,任何在 ABC 上的令牌都会发生变化。

    1.2K20

    面向对象封装、继承、多态

    方法的重写 子类 拥有 父类 的所有 方法 和 属性 子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发 应用场景 当 父类 的方法实现不能满足子类需求时,可以对方法进行...) 这种方式,目前在Python 3.x还支持这种方式 这种方法 不推荐使用,因为一旦 父类发生变化,方法调用位置的 类名 同样需要修改 提示 在开发时,父类名和super()两种方式不要混用...Python 中的 MRO —— 方法搜索顺序 Python中针对 类 提供了一个 内置属性 __mro__ 可以查看 方法 搜索顺序 MRO 是method resolution order,...以object为基类的类,推荐使用 经典类:不以object为基类的类,不推荐使用 在Python 3.x中定义类时,如果没有指定父类,会 默认使用 object 作为该类的 基类 ——Python...3.x中定义的类都是 新式类 在Python 2.x中定义类时,如果没有指定父类,则不会以object作为 基类 新式类 和 经典类 在多继承时 —— 会影响到方法的搜索顺序 为了保证编写的代码能够同时在

    62520

    python面向对象的继承-组合-02

    为什么使用继承:# 其目的是为了重用已经有了的代码,提高重用性 如何使用继承 语法 class 类名称(父类的名称): # 在python中 一个子类可以同时继承多个父类 继承小案例(子类直接用父类的方法...抽象 直意:不具体、不清晰、很模糊、看不太懂 编程中:# 将多个子类的中相同的部分,进行抽取,形成一个新的类,这个过程也称之为抽象 # 抽取老师学生的共同特征,然后再继承 class Person:...Object --> 报错 派生与覆盖(重写) 派生:# 当一个子类中出现了与父类中不同的内容时,这个子类就称之为派生类 class Person: @staticmethod def...当使用super()函数时,python3会在mro列表上继续搜索下一个类。...,一定要看mro列表 类的属性的查找顺序 新式类中的菱形继承 ?

    57430

    python学习笔记6.4-类的多重继承(super()函数)

    说到面向对象,就少不了研究面向对象的特点(继承,封装,多态)。Python中类的继承的关键是正确使用super()函数,而这恰好是我们理解最不好的地方。...要理解为什么会这样,我们得先去理解python是如何实现类的继承的。针对于每一个定义的类,python都会计算出一个方法解析顺序(MRO)的列表。..., ) 可以看出,MRO是以元组的结构来储存的,同时,要实现继承,python从MRO最左边的类开始(子类),从左到右依次查找,直到查找到待查的属性为止...简单来说就是一种针对父类的归并排序它满足3个条件: (1)先检查子类,再检查父类 (2)有多个父类(多重继承),按照MRO列表的顺序依次检查 (3)如果下一个类中出现两个合法的选择,那么就从第一个父类中选择...(避免重复继承,保证每个父类只继承一次) 当使用super()函数时,python会继续从MRO中的下一个类开始搜索,只要每一个重新定义过的方法(比如init())都使用了super()函数,并且调用了他们一次

    1.1K90

    Python_类的继承

    3.类继承的顺序 如果子类继承一个或多个父类时,子类属性是任何调用的呢?...总结:1.子类继承父类时,在子类进行属性调用的顺序为:先查找自己的属性字典,若自己的属性字典中无该属性,则会依次按照继承父类的顺序来依次查找父类的属性字典;2.子类继承父类,当父类和子类均有相同的属性时...继承原理:python到底是如何实现继承顺序的呢?对于你定义的每一个类,python会计算出一个方法解析顺序(MRO)列表,这个MRO列表就是一个简单的所有基类的线性顺序列表。...为了实现继承,python会在MRO列表上从左到右查找基类,直到找到第一个匹配这个属性的类为止。而这个MRO列表的构造是通过一个C3线性化算法来实现的。...这个算法实际上就是合并所有父类的,MRO列表并遵循如下三条准则: ① 子类会由于父类被检查; ② 多个父类会根据他们在列表中的顺序被检查; ③ 如果对于下一个类存在两个合法的选择,应选择第一个父类; 为此我们可以直接使用子类的

    99210

    电话面试题总结,Python基础部分

    ,需要显式继承自object,即使不显式继承也会默认继承自object,例如: class lei(object): pass 经典类在类多重继承的时候是采用从左到右深度优先原则匹配方法的 而新式类是采用...C3算法 经典类没有MRO和instance.mro()调用的 (1)子类的初始化的时候,用传统的调用直接用父类调用__init__() (2)新式类(就是父类继承object类),子类的初始化的时候...为什么改变了 Parent.x 的值还会改变 Child2.x 的值,但是同时 Child1.x 值却没有改变? 这个答案的关键是,在 Python中,类变量在内部是作为字典处理的。...这就是为什么第二个 print 语句的输出是 1 2 1 最后,如果该值在父类中被改变(例如,我们执行语句 Parent.x = 3),这个改变会影响 到任何未重写该值的子类当中的值(在这个示例中被影响的子类是...随后当 extendList 没有被指定的列表参数调用的时候,其使用的是同一个列表。这就是为什么当函数被定义的时候,表达式是用默认参数被计算,而不是它被调用的时候。

    98720

    【从零学习python 】48.Python中的继承与多继承详解

    在Python中,继承可以分为单继承、多继承和多层继承。 单继承 子类只继承一个父类,继承概念表示子类获得了父类的所有方法和属性。...pass 使用多继承时需要注意以下事项 如果不同的父类中存在同名的方法,子类对象在调用方法时,会调用哪个父类的方法?应尽量避免这种容易产生混淆的情况。...如果多个父类之间存在同名的属性或方法,应尽量避免使用多继承。 Python中的MRO Python中针对类提供了一个内置属性__mro__,可以用来查看方法的搜索顺序。...经典类:不以object为基类的类,不推荐使用。 在Python3.x以后定义类时,如果没有指定父类,这个类会默认继承自object,所以,Python3.x版本定义的类都是新式类。...在Python2.x中定义类时,如果没有指定父类,则不会继承自object。

    18010

    Python 进阶指南(编程轻松进阶):十六、面向对象编程和继承

    如果一个类的覆盖方法做的事情与父类中被覆盖的方法完全不同,就没有必要使用super()调用被覆盖的方法。当一个类有不止一个父方法时,super()函数特别有用,这将在本章后面的“多重继承”中解释。...组合是一种类设计技术,它将对象包含在类中,而不是继承那些对象的类。这就是我们在给类添加属性时所做的事情。当使用继承设计你的类时,支持组合而不是继承。...正如卢西亚诺·拉马尔霍所说,“将物品整齐有序地摆放能激发我们的秩序感;程序员这么做只是为了好玩。”当一个类或者一个模块中的几个函数可以达到同样的效果时,我们将创建类、子类和子类。...由于 Python 的灵活性,这种语言不仅提供了 OOP 特性,而且当它们不适合你的程序需求时,也不要求你使用它们。 多重继承 许多编程语言将类限制为最多一个父类。...但这并没有结束:接下来,这个方法调用super().getBoardStr()。super是 Python 的super()函数的一个有点误导的名字,因为它不返回父类,而是返回 MRO 中的下一个类。

    56520

    Python 面向对象 OOP-三大特性#学习猿地

    ### 计算机中的继承 > 在面向对象中,一个类去继承父类,那么这个类就拥有了父类中的所有成员(除了私有成员) ### 概念: + 被其它类继承的类,这个类称为 父类 也叫做 基类 或者 超类 + 继承其它类的类...子类(父类): pass ``` ### 继承的特征 + 在不指定继承的父类时,所有类都继承自object类(系统提供) 了解 + 子类继承了父类后,就拥有了父类中的所有成员包括魔术方法(除了私有成员...```python ''' 在定义类后,程序会自动生成一个继承的列表 MRO (Method Realtion Order) 方法关系列表 MRO列表生成原则: 1....先子类,后父类的顺序原则,最终的类时系统提供的object类 MRO的调用方法 类名.mro() ''' C.mro() # [, , ...# super()方法在调用时,会自动把当前self传入到上一级的类的方法中 ``` #### 类关系检测 issubclass() > issubclass() 检测一个类是否时另一个类的子类 ```

    37720
    领券