博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python棱形继承(钻石继承)
阅读量:6908 次
发布时间:2019-06-27

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

class A(object):

def func(self): print('A')

class B(A):

def func(self):
super().func()
print('B')

class C(A):

def func(self):
super().func()
print('C')

class D(B,C):

def func(self):
super().func()
print('D')

b = D()

b.func()
print(B.mro())
#2.7
# 新式类 继承object类的才是新式类 广度优先
# 经典类 如果你直接创建一个类在2.7中就是经典类 深度优先
# print(D.mro())
# D.mro()

# 单继承 : 子类有的用子类 子类没有用父类

# 多继承中,我们子类的对象调用一个方法,默认是就近原则,找的顺序是什么?
# 经典类中 深度优先
# 新式类中 广度优先
# python2.7 新式类和经典类共存,新式类要继承object
# python3 只有新式类,默认继承object
# 经典类和新式类还有一个区别 mro方法只在新式类中存在
# super 只在python3中存在
# super的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的

 

B和C有共同父类,class D(B,C):先找B再找C最后找A

super按照棱形继承顺序查找,执行顺序类似多装饰器的套娃执行顺序。

如果A和E没有共同父类要保证所有类都能执行到,顺序就变为BACE

A和E有共同父类也要执行B后再执行A,因为如果执行C就不会执行A了(A不是C的父类)。

 

总结:

python3广度优先,但要保证所有的父类都搜索到,所以有的时候也会深度优先,在考虑继承顺序时,只需要考虑到能将所有的类都连起来就对了。

转载于:https://www.cnblogs.com/daju/p/10222615.html

你可能感兴趣的文章
使用Maven构建多模块项目
查看>>
Google Shell Style Guide
查看>>
spring和springMVC的上下文
查看>>
create.c
查看>>
2014 蓝桥杯 预赛 c/c++ 本科B组 第九题:地宫取宝(12') [ dp ]
查看>>
手机尾号猜年龄骗局解密
查看>>
并查集加优先队列
查看>>
es6—变量的解构赋值
查看>>
腾讯app任务集市签名 php实现代码
查看>>
【kubernetes】ubuntu14.04 64位 搭建kubernetes过程
查看>>
一条命令搞定在VMware中的Ubuntu14.04 64 位安装Docker
查看>>
抽屉效果学习
查看>>
(转)Unity3D中常用的数据结构总结与分析
查看>>
创建压缩文件,并添加压缩的内容
查看>>
delegation
查看>>
mui 事件绑定(on)
查看>>
ListView 九宫格布局实现
查看>>
spring aop 声明式事务管理
查看>>
List源码学习之LinkedList
查看>>
Kotlin入门(11)江湖绝技之特殊函数
查看>>