mro

面向对象3-继承

别等时光非礼了梦想. 提交于 2019-11-30 09:28:34
一、多继承 MRO 即 method resolution order (方法解释顺序),主要用于在多继承时判断属性的路径。 python新式类的多继承顺序采用 c3算法 如果继承至一个基类: class B(A) 这时B的mro序列为[B,A] 如果继承至多个基类 class B(A1,A2,A3 ...) 这时B的mro序列 mro(B) = [B] + merge(mro(A1), mro(A2), mro(A3) ..., [A1,A2,A3]) merge操作就是C3算法的核心。 遍历执行merge操作的序列, 如果一个序列的第一个元素,是其他序列中的第一个元素,或不在其他序列出现,则从所有执行merge操作序列中删除这个元素,合并到当前的mro中。 即使满足:序列中第一个元素,且在其他序列要么也出现在第一个位置,要么不出现 merge操作后的序列,继续执行merge操作,直到merge操作的序列为空。 如果merge操作的序列无法为空,则说明不合法 python官方网站相关 例子: class A(O):pass class B(O):pass class C(O):pass class E(A,B):pass class F(B,C):pass class G(E,F):pass A、B、C都继承至一个基类,所以mro序列依次为[A,O]、[B,O]、[C,O]

一窥Python中MRO排序原理

南楼画角 提交于 2019-11-29 08:16:59
在 Python 中用到多继承时,调用父类方法很容易出错:父类方法调用了多次,只能通过__mro__魔法方法来获取调用顺序,花了点时间了解其中涉及的排序算法,顺带记录 拓扑排序 在了解 MRO 排序算法之前,先了解下拓扑排序(以下摘自维基百科) 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting)。 1.每个顶点出现且只出现一次; 2.若A在序列中排在B的前面,则在图中不存在从B到A的路径。 说人话,看下面的图就明白了 (图片搬运自别人的博客,画的很不错我直接拿来用了,链接在文章末尾),图中每个点都是有指向性的:可能指向别人或者被别人指向。 拓扑顺序就是:每次找到一个只指向别人的点 (学术性说法:入度为0),记录下来;然后忽略掉这个点和它所指出去的线,再找到下一个只指向别人的点,记录下来,直到剩最后一个点,所有记录的点的顺序就是拓扑顺序 上图中,只有点1只指向别人,输出1;去掉点1和它伸出的两根线外只有点2只指向别人,输出2;…类推下去,得到拓扑排序结构: 1 2 4 3 5 2. MRO 排序算法 MRO 排序应用了 C3 算法,想了解 C3 自己查吧…总之得到的结果类似于拓扑排序,下面有段简单的多继承代码和其对应的拓扑排序的抽象图 (所用代码实例和图片均来应用自别处,文章末尾有链接)

Python高级语法-多继承MRO相关-args和kwargs(4.5.2)

杀马特。学长 韩版系。学妹 提交于 2019-11-28 15:07:56
目录 1.说明 2.代码 关于作者 @ 1.说明 args数据类型为元组 kwargs数据类型为字典 一般传入方法中使用遍历去得到值 这个传入参数的顺序没有特殊的要求 当你自定义的参数传完以后,写了名字的就给kwargs,没有名字的给args 2.代码 def test(*args,**kwargs): for i in args: print(i) for i in kwargs: print(kwargs[i]) if __name__ == '__main__': test(1,2,3,3,4,4,12,4,12,4,name="adada",hhehe="dadad") 关于作者 个人博客网站 个人GitHub地址 个人公众号: 来源: https://www.cnblogs.com/simon-idea/p/11411781.html

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

让人想犯罪 __ 提交于 2019-11-28 14:48:59
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-11-27 21:48:25
面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念。 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属性 如果一个类A"继承自"另一个类B,则把类A称为类B的子类(或派生类),把类B称为父类(或超类或基类) 继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。 class Person: def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex class Cat: def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex class Dog: def __init__(self,name,sex,age): self.name = name self.age = age self.sex = sex # 继承的用法: class Aniaml(object): def __init__(self,name,sex,age): self.name =

Python探路-多重继承

扶醉桌前 提交于 2019-11-27 03:38:17
多重继承都会让python初学者很疑惑,哪怕当时看完,过一段时间也就遗忘了,因此写下了本文,希望借此能够让python初学者能够比较深刻的记住。 多重继承查找父类的方法有两种: 1、深度优先---针对经典类,即python2.2之前和python2.7 2、C3算法---针对新式类 一、深度优先: 可从某个定点v出发,访问此顶点,然后一次从v的违背访问的邻接点触发深度优先遍历图,直至途中所有和v有路径相同的顶点都被访问到;若此时途中尚有顶点未被访问,则另选途中一个未曾被访问的顶点做开始点。 例: 结果:v1, v2, v4, v5, v3, v7, v6 2、C3算法: 其实举个例子更能说明问题: 结果大概是这样: mro(A)=[A] + merge(mro(B),mro(C),[B,C]) mro(B) = [B] + mro(D) mro(D)=[D,O] 所以:mro(A)= [A] + merge(mro(B),mro(C),[B,C]) = [A] + merge([B,mro(D)],[C,O],[B,C]) 由于B不在任何列表的列尾,所以上式等于: = [A,B]+merge([mro(D)],[C,O],[C]) = [A,B]+merge([D,O],[C,O],[C]) = [A,B,D]+merge([O],[C,O],[C]) 由于O为[C,O]的列尾

Python进阶编程 类与类的关系

独自空忆成欢 提交于 2019-11-26 10:28:59
类与类的关系 依赖关系 # 依赖关系: 将一个类的类名或者对象传给另一个类的方法中. class Elephant: def __init__(self, name): self.name = name def open(self,r1): # print(ref1) print(f'{self.name}默念三声: 芝麻开门') r1.open_door() def close(self): print('大象默念三声:芝麻关门') class Refrigerator: def __init__(self, name): self.name = name def open_door(self): print(f'{self.name}冰箱门被打开了....') def close_door(self): print('冰箱门被关上了....') e1=Elephant('大象') r1=Refrigerator('海尔冰箱') e1.open(r1) #将一个类的类名或者对象传给另一个类的方法中.产生了依赖关系 组合关系 组合: 将一个类的对象封装成另一个类的对象的属性. class Boy: def __init__(self, name): self.name = name def meet(self, girl_friend=None): self.girl_friend

面向对象之继承

天大地大妈咪最大 提交于 2019-11-25 21:01:40
面向对象之继承 什么是面向对象的继承? 继承 (英语:inheritance)是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B,就把这个A称 为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。继承可以使得子类别具有父类别的各种属性和方法,而 不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的 原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。 一般静态的面向 对象编程语言,继承属于静态的,意即在子类别的行为在编译期就已经决定,无法在执行期扩充。 class Person: def __init__(self,name,sex,age): self.name =name self.age = age self.sex = sex class Cat: def __init__(self,name,sex,age): self.name = name self.sex =sex self.age =age class Dog: def __init__(self,name,age,sex): self.name =name self.sex =sex self.age = age # 定义三个不同的类 class Animal(object):