python 菱形继承问题究极版

如果只是正常的菱形继承,经典类(python2中最后一个父类不继承object类)是深度优先,即会从左边父类开始一路走到底

新式类(最后一个父类继承了object类)是广度优先,即从左边父类开始继承,留着最后一个类不继承

 # 此处只打印新式类正常菱形继承时的顺序,python2中经典类的顺序是F->D->B->A->E->C

 1 class A(object):
 2     pass
 3
 4
 5 class B(A):
 6     pass
 7
 8
 9 class C(A):
10     pass
11
12
13 class D(B):
14     pass
15
16
17 class E(C):
18     pass
19
20
21 class F(D, E):
22     pass
23
24
25 print(F.mro())
26
27 # 输出
28 ‘‘‘
29 [<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>]
30 ‘‘‘

如果是不正常的菱形继承,即最后两个类继承了两个相同的父类,但是父类顺序不同则会报错,此处是A,G互换

 1 class G(object):
 2     pass
 3
 4
 5 class A(object):
 6     pass
 7
 8
 9 class B(A, G):  # 此处继承顺序是A,G
10     pass
11
12
13 class C(G, A):  # 此处继承顺序是G,A
14     pass
15
16
17 class D(B):
18     pass
19
20
21 class E(C):
22     pass
23
24
25 class F(D, E):
26     pass
27
28
29 print(F.mro())
30
31 # 输出
32 ‘‘‘
33 Traceback (most recent call last):
34   File "C:/test.py", line 23, in <module>
35     class F(D,E):
36 TypeError: Cannot create a consistent method resolution
37 order (MRO) for bases A, G
38 ‘‘‘

如果继承两个相同的父类,但是顺序相同,会和你想的一样,如果两者继承的都是A,G,打印顺序会是先A,后G.

 1 class G(object):
 2     pass
 3
 4
 5 class A(object):
 6     pass
 7
 8
 9 class B(A, G):  # 此处继承顺序是A,G
10     pass
11
12
13 class C(A, G):  # 此处继承顺序是A,G
14     pass
15
16
17 class D(B):
18     pass
19
20
21 class E(C):
22     pass
23
24
25 class F(D, E):
26     pass
27
28
29 print(F.mro())
30
31 # 输出
32 ‘‘‘
33 [<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘__main__.G‘>, <class ‘object‘>]
34 ‘‘‘

原文地址:https://www.cnblogs.com/chenyoude/p/9857308.html

时间: 2024-11-03 22:04:41

python 菱形继承问题究极版的相关文章

java 网络编程-TCP-多人群聊究极版

客户端:多个客户可以正常收发信息,因为可以同时发送和接受信息,不是发送完信息后等待返回信息,所以要加入多线程 public class Client { public static void main(String[]args) throws UnknownHostException, IOException { System.out.println("客户端启动中..."); BufferedReader br =new BufferedReader(new InputStreamR

python 单继承、多继承、菱形继承

单继承与多继承 单继承:一个类只能继承一个父类的方式.多继承:一个类可以继承多个父类的方式. 单继承:(生物角度) 人类->哺乳类动物->动物->生物->有机物.... 多继承:(社会角度) 舞蹈老师(教舞蹈) 体育老师(运动) 爸爸(抽烟) 妈妈(打扫卫生) 我(舞蹈,运动,抽烟,打扫卫生) 单继承案例: 父类: pass 子类(父类): pass 多继承案例: 父类1: pass 父类2: pass 父类3: pass 子类(父类1,父类2,父类3): pass 多继承的问题所

菱形继承问题(钻石问题)

在学习C++的时候,菱形继承问题绝对是一个不可避免的重点问题,那么什么是菱形继承问题呢?下图就是,长得像不像钻石?我画图确实很难看 因为C++允许多继承,当继承关系像上图这样子的时候,就会出现这样子的情况 A类是基类,B里面有个A我表示为B(A),C里面有个A我表示为C(A) 那么D里面有B和C我表示为D(B(A)C(A)) 当我们想去使用D里面的A的时候,或者说访问A的部分值,在说白了究竟哪个A才是属于D的,D中的A究竟是B的A还是C的A? 1 class A 2 {}; 3 class B

Python之继承

继承是所有开发语言的必修内容,而本文写的只是Python继承中的特殊之处,关于继承概念及内容可以自行百度(不装B,感觉百度挺好的) 1.构造函数: 要说继承,先要说一下构造函数.Java要求是与类名相同并且无返回值,而Python则是强制要求命名为"__init__()". 当创建类的对象时,会自动先调用构造函数,一般用于初始化.构造函数可以不写,那么程序会隐式自动增加一个空的构造函数. 2.继承写法: (1).class 空格 类名称 括号内填写父类名 冒号 具体写法如下 class

面向对象-继承,顺序查找,派生,子类访问父类,菱形继承

OOP的三大特征(优势) 1.封装 2.继承 3.多态 继承:是两个对象之间产生的一种关系 a继承b 在OOP的程序中继承是描述类与类之间的一种关系继承的好处:程序中 一个类a继承另一个类b a就可以使用B的属性和方法具体的说:继承极大的提高了代码的重用性继承描述的是 什么 是什么的关系 注意:在使用集成时,要自己分析.类与类之间的关系 不应该违反显示生活中的原则在使用继承的时候一定是先抽象 在继承抽象:抽取一堆类共同拥有的内容 形成一个新的抽象的概念(也称为公共基类) 这个过程就叫做 抽象注意

类的继承、菱形继承、派生、多态

一.类的继承(查找顺序先自己再父类) class ParentFoo: def __init__(self,first_name,car,money,house): self.first_name=first_name self.car=car self.money=money self.house=house def teach(self): print("%s教人"%self.first_name) # f1=ParentFoo('zhu','tesla',10,'Haozhai'

面向对象概论之继承简述,组合简述,菱形继承简述

一.继承 1.简述: 用来表述的是类与类之间的关系,比如A继承了B,那么A会有B已有的方法和属性. 那么A称为子类,B为父类.(父类又叫:基类) 使用继承可以不再用重复写代码的情况下,从而重复使用代码. 提高了编程效率. 2.正确使用继承思想:       1.先抽象然后再继承       2.继承已经存在的类,可拓展或是修改原始功能 3.在继承里的属性查找顺序: 对象自己的----->所在的类中----->父类----->父类的父类------->Object 4.继承语法表达:

python 29 继承

目录 一,property 用法 二,继承 三,继承的属性查找 一,property 用法 property是一个装饰器,是用来绑定给对象的方法伪造成一个数据属性 案例一: class People: def __init__(self, name, weight, height): self.name = name self.weight = weight self.height = height # 定义函数的原因1: # 1.从bmi的公式上看,bmi应该是触发功能计算得到的 # 2.bm

C++之菱形继承

当我们谈C++时,我们谈些什么? 封装,继承,多态.这是C++语言的三大特性,而每次在谈到继承时我们不可避免的要谈到一个很重要的问题--菱形继承. a.菱形继承是什么 如上图,菱形继承即多个类继承了同一个公共基类,而这些派生类又同时被一个类继承.这么做会引发什么问题呢,让我们来看一段代码吧! #include<iostream> using namespace std; class Base { protected: int _base; public: void fun() { cout &