mro

python继承 super()

为君一笑 提交于 2019-12-23 05:43:23
写这篇博文,始于以下问题的探究: 1 #coding:utf-8 2 class A(object): 3 def __init__(self): 4 print 'enter A' 5 print 'leave A' 6 class B(object): 7 def __init__(self): 8 print 'enter B' 9 print 'leave B' 10 11 class C(A): 12 def __init__(self): 13 print 'enter C' 14 super(C, self).__init__() 15 print 'leave C' 16 17 class D(A): 18 def __init__(self): 19 print 'enter D' 20 super(D, self).__init__() 21 print 'leave D' 22 23 class E(B, C): 24 def __init__(self): 25 print 'enter E' 26 B.__init__(self) 27 C.__init__(self) 28 print 'leave E' 29 30 class F(E, D): 31 def __init__(self): 32 print 'enter F' 33 E.__init_

python---方法解析顺序MRO Method Resolution Order以及解决类中super方法

限于喜欢 提交于 2019-12-16 07:03:46
目录 MRO了解: 而具体讨论MRO,我们需要针对不同python版本中的MRO进行解析   一:经典类(深度优先搜索)   二:新式类(广度优先搜索)   三:新式类(C3算法实现:看起来就是将上面两者的优点结合了。所以在Python3中全部都是新式类,不需要object继承)   四:C3算法了解 下面讨论__init__和super()方法的关系   一:在单继承中super方法和__init__使用时功能上基本是无差别的   二:super方法只在新式类中适用   三:注意super()不是父类,而是执行MRO顺序中的下一个类!!   四:super()可以避免重复调用 MRO了解: 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就需要对当前类和基类进行搜索以确定方法所在的位置。 而搜索的顺序就是所谓的「方法解析顺序」(Method Resolution Order,或MRO)。 对于只支持单继承的语言来说,MRO 一般比较简单;而对于 Python 这种支持多继承的语言来说,MRO 就复杂很多。 而具体讨论MRO,我们需要针对不同python版本中的MRO进行解析 经典类:DFS深度优先搜索(Python2.2以前的版本) 新式类:BFS广度优先搜索(Python2.2中提出,在与经典类共存的情况下

方法解析顺序(MRO)

﹥>﹥吖頭↗ 提交于 2019-12-16 03:06:40
方法解析顺序(Method Resolution Order - MRO ),是一种在多重继承中用于确定方法搜索顺序的算法,又称 C3 超类线性化(superclass linearization)。Python 会计算出每一个类的 MRO 列表。一个类的 MRO 列表是一个包含了其继承链上所有基类的线性顺序列,并且列表中的每一项均保持唯一。当需要在继承链中寻找某个属性时,Python会在 MRO 列表中从左到右开始查找各个基类,直到找到第一个匹配这个属性的类为止。 我们不必深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则: 子类会先于父类被检查 多个父类会根据它们在列表中的顺序被检查 如果对下一个类存在两个合法的选择,选择第一个父类 其实我们只需要知道 MRO 列表中类的顺序代表着类层次结构间的关系即可。 Python 中的相关属性如下: class.__mro__ - 该属性用于存储 MRO 元组,以便在方法解析期间提供基类排序。 class.mro() - 通过元类(metaclass)可以覆盖此方法,以自定义类实例的方法解析顺序。该方法会在程序初始化时调用,其结果存储在 __mro__ 中。 考虑如下类层次结构的 MRO 列表: class Base: def __init__(self): print('Base.__init__')

mro 继承顺序 与 菱形继承(钻石继承)

这一生的挚爱 提交于 2019-12-05 18:07:34
1.调用mro 返回的是一个继承序列,super的继承顺序严格遵循mro继承序列 2.钻石继承 :多继承的情况下造成钻石继承 凡是继承object 对象的类都是新式类,python3默认所有的类都继承object类,都是新式类 python2 中 有新式类和 经典类 继承object才是经典类 mro的查找顺序: 新式类:广度优先 经典类:深度优先 多继承:默认从左向右继承顺序 # 新式类: class A(object): # def test(self): # print('from A') pass class B(A): # def test(self): # print('from B') pass class C(A): # def test(self): # print('from C') pass class D(B): # def test(self): # print('from D') pass class E(C): # def test(self): # print('from E') pass class F(D, E): # def test(self): # print('from F') pass # F-->D-->B-->E-->C-->A-->object # print(F.mro()) obj = F() 来源: https://www

python继承

匿名 (未验证) 提交于 2019-12-02 22:51:30
一、单继承 子类调用父类的一个方法,可以用super(): class A(object): def pp(self): print('pp A') class B(A): def pp(self): super().pp() print("pp B") b = B() b.pp() #结果: pp A pp B super()常用的方法是在__init__()方法中确保父类被正确的初始化了: super(cls,inst).__init__() #cls,init 可以省略 class A(object): def __init__(self): self.x = 1 class B(A): def __init__(self): super(B,self).__init__() self.x = self.x +1 print(self.x) b = B() #结果 2 也可以直接调用父类的一个方法 : A.__init__(self) class A(object): def __init__(self): self.x = 1 class B(A): def __init__(self): A.__init__(self) self.x = self.x +1 print(self.x) b = B() #结果 2 二、多继承 super()

python中的MRO算法[转]

匿名 (未验证) 提交于 2019-12-02 22:51:30
MRO(Method Resolution Order):方法解析顺序 。 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就需要对 当前类和基类进行搜索以确定方法所在的位置。而搜索的顺序就是所谓的「方法解析顺序」(Method Resolution Order,或MRO)。对于只支持单继承的语言来说,MRO 一般比较简单;而对于 Python 这种支持多继承的语言来 说,MRO 就复杂很多。 如果 x 是 D 的一个实例,那么 x.show() 到底会调用哪个 show 方法呢?如果按照 [D, B, A, C] 的搜索顺序,那么 x.show() 会调用 A.show();如果按照 [D, B, C, A] 的搜索顺序,那么 x.show() 会调用 C.show()。由此可见,MRO 是把类的继承关系线性化的一个过程,而线性化方式决定了程序运行过程中具体会调用哪个方法。既然如此,那什么样的 MRO 才是最合理的?Python 中又是如何实现的呢? 经典类(classic class)的深度遍历。 Python 2.2 的新式类(new-style class)预计算。 Python 2.3 的新式类的C3 算法。它也是 Python 3 唯一支持的方式。 Python 有两种类:经典类(classic class)和新式类(new

python继承

时光怂恿深爱的人放手 提交于 2019-12-02 21:50:16
一、单继承 子类调用父类的一个方法,可以用super(): class A(object): def pp(self): print('pp A') class B(A): def pp(self): super().pp() print("pp B") b = B() b.pp() #结果: pp A pp B super()常用的方法是在__init__()方法中确保父类被正确的初始化了: super(cls,inst).__init__() #cls,init 可以省略 class A(object): def __init__(self): self.x = 1 class B(A): def __init__(self): super(B,self).__init__() self.x = self.x +1 print(self.x) b = B() #结果 2 也可以直接调用父类的一个方法 : A.__init__(self) class A(object): def __init__(self): self.x = 1 class B(A): def __init__(self): A.__init__(self) self.x = self.x +1 print(self.x) b = B() #结果 2 二、多继承 super()

【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法>

三世轮回 提交于 2019-12-01 23:16:21
【转】python---方法解析顺序MRO(Method Resolution Order)<以及解决类中super方法> MRO了解: 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就需要对当前类和基类进行搜索以确定方法所在的位置。而搜索的顺序就是所谓的「方法解析顺序」(Method Resolution Order,或MRO)。对于只支持单继承的语言来说,MRO 一般比较简单;而对于 Python 这种支持多继承的语言来说,MRO 就复杂很多。 而具体讨论MRO,我们需要针对不同python版本中的MRO进行解析 经典类:DFS深度优先搜索(Python2.2以前的版本) 新式类:BFS广度优先搜索(Python2.2中提出,在与经典类共存的情况下,是否继承object是他们的区分方式) 新式类C3算法:Python2.3提出(也是现在Python3唯一支持的方式) 对于下面讨论的类的多重继承:我们讨论两种情况。 一:经典类(深度优先搜索) 在经典类中,没有__mro__属性可以去查看MRO的顺序,但是,可以使用inspect模块中getmro方法 import inspect inspect.getmro(类名) (一)正常继承模式 在正常继承模式下,不会引起任何问题 (二)交叉继承模式 缺点 :C类原本是D的子类

python中的MRO算法[转]

左心房为你撑大大i 提交于 2019-12-01 11:56:23
1.前言 MRO(Method Resolution Order):方法解析顺序 。 对于支持继承的编程语言来说,其方法(属性)可能定义在当前类,也可能来自于基类,所以在方法调用时就需要对 当前类和基类进行搜索以确定方法所在的位置。而搜索的顺序就是所谓的「方法解析顺序」(Method Resolution Order,或MRO)。对于只支持单继承的语言来说,MRO 一般比较简单;而对于 Python 这种支持多继承的语言来 说,MRO 就复杂很多。 2.菱形继承范例 如果 x 是 D 的一个实例,那么 x.show() 到底会调用哪个 show 方法呢?如果按照 [D, B, A, C] 的搜索顺序,那么 x.show() 会调用 A.show();如果按照 [D, B, C, A] 的搜索顺序,那么 x.show() 会调用 C.show()。由此可见,MRO 是把类的继承关系线性化的一个过程,而线性化方式决定了程序运行过程中具体会调用哪个方法。既然如此,那什么样的 MRO 才是最合理的?Python 中又是如何实现的呢? 3.Python 中三种不同的 MRO 经典类(classic class)的深度遍历。 Python 2.2 的新式类(new-style class)预计算。 Python 2.3 的新式类的C3 算法。它也是 Python 3 唯一支持的方式。 3

day20

天大地大妈咪最大 提交于 2019-12-01 02:28:24
一、继承 类的继承 面向对象三要素之一,继承Inheritance class Cat(Animal)这种形式就是从父类继承,继承可以让子类从父类获取特征(属性和方法) 在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样可以减少代码,多复用,子类可以定义自己的属性和方法 1、查看继承的特殊属性和方法 base : 类的基类 based : 类的基类元组 mro : 显示方法查找顺序,基类的元组 __mro()__方法 : 显示方法查找顺序,基类的元组 subclasses () : 类的子类列表 2、继承中的查找顺序 从父类继承,自己没有的就可以到父类中找 私有的都是不可以访问的,但是本质上依然是改了名称放在这个属性所在类的_ dict -中 继承时,公有的,子类和实例都可以随意访问,私有成员被隐藏了,子类和实例不可直接访问 当私有变量所在的类内的方法中可以访问这个私有变量 属性查找属性:实例的dict--》类的dict--》父类dict 多继承 OCP原则:多继承,少修改;继承的用途:增强基类,实现多 1、多态 在面向对象中,父类,子类通过继承联系在一起,如果可以通过一套方法,就可以实现不同的表现,就是多态 一个类继承自多个类就是多继承,它将具有多个类的特征 2、多继承弊端 多继承很好的模拟了世界,因为事物很少是单一继承,但是舍弃简单,必然引入复杂性带来冲突