2019/11/14 02-古典类新式类和MRO

在这里插入图片描述
python不同版本中对类的定义是有差别的,早期的是不同方式定义不同的类,2.2之前,没有共同的祖先。之后引入object,是所有类的祖先
但是之前的类不是这个共同祖先
所以在2中和3中,就是新的类型和旧的类型该怎么办,就分成了古典类和新式类的问题,2的解决办法是,新的新办法,老的老办法
在python3中就都解决了,干脆重新做,所有类都必须继承自object,都是新式类
没有继承自object,在2里面都是古典类
新式类都继承object,新式类都可以使用super,如果使用super,古典类无法使用super,需要使用类名.点的方式来访问
在这里插入图片描述
打开2.7
在这里插入图片描述在这里插入图片描述
现在的版本是2.7.10
在这里插入图片描述
A就没有继承自object
B的object是type写的

在这里插入图片描述
这个是3的版本
在这里插入图片描述在这里插入图片描述
用type试试
在这里插入图片描述
继承要看bases,,要看mro才能知道有没有继承

在3里面,type和class是一致的

在这里插入图片描述
在2.7就是新式类新办法,旧式类旧办法
在这里插入图片描述
新式类才有这些东西
在这里插入图片描述
3是一个更加面向对象的版本,一切都继承自object
在这里插入图片描述
dir其实是可以尽量收集一个对象,可以尽量收集这个对象所有的属性,
返回的是一个字符串的列表,返回的是所有属性名称的列表

在这里插入图片描述
object这个基类有很多属性都继承下来了
在这里插入图片描述在这里插入图片描述
继承相当于少些了很多代码,能复用就复用,继承的目的是本身就有跟父类一些不同的东西,多用继承少做修改,在面向对象中,一个类可以继承自多个类就是多继承
(比如猫和够,都继承动物类,但是叫的方法,狗和猫都不一样,同一个方法在不同类上有不同的表现)多态有两个前提,要继承,还要覆盖

让C继承自A,B
在这里插入图片描述在这里插入图片描述
多继承可以很好的模拟这个世界(多继承的复杂性是很麻烦的事情,会有冲突(孩子的眼睛像爸爸还是妈妈)
多继承实现比较复杂,会对编译器增加负担,编译器会变得异常复杂
所以现代语言有一些摈弃了多继承

java是在继承这条线上做的简单了,接口多继承,一个类继承一个类,但是可以继承自很多个接口(接口相当于整个类具有什么样的能力,接口在java里就是纯函数定义,只是一个方法申明,继承者必须实现这些方法,语法叫实现这些接口)
在这里插入图片描述
二义性事非常麻烦的一件事情,继承实际上是一棵继承数,但是有了多继承就有交叉了,可能是个图了,能不能遍历这个图遍历树的时候又层序遍历,先根,中跟,后跟遍历,先序,中序后序遍历,层序遍历时广度优先,先序根序遍历,是先深,深度优先
遍历有深度优先和广度优先

在这里插入图片描述在这里插入图片描述
假如myclass要调用x犯法,c上有x方法,a上也有,那么只找到c就好了,通过继承是override,就知道现在要访问谁在这里插入图片描述
但是多继承这个该如何访问x方法,这是菱形的继承模型,就会带来二义性,同样的方法,该怎么选择
在这里插入图片描述
python到3为止,有三套解决方案,这就是为什么到python3必须统一
在早期的时候是深度优先(就是有数据,先根再左子树右子树,就是DLR
遍历出来就是 MCLASS ,D,B,A ,C,A,这就是python的最早的继承序列
这个时候A的x方法就在c前面了(但是直接是C靠的比较近),这个方法是在2,2之前就这么用
在这里插入图片描述
2.2版本做了件事情,将这么序列做了些改动,如果这个序列出现了重复的结点。则使用这个序列最后的结点
就把前面的A去掉了,这次就找c了,
但是2.2还是才用了深度优先的策略

在这里插入图片描述
对新式类后面加个object即可在这里插入图片描述
继承的单调性问题没有解决,有可能出现这样的继承,但是在2.2搞不定,继承路线不确定,一会可能是ba,ab,走哪个不确定
父类有父类的继承,子类有子类的继承,走的路应该是一致的,但是实际上并不是
在这里插入图片描述
PEP,必须解决二义性和非单调的问题在这里插入图片描述

就到了2.3,新的算法解决这个问题

这两个对经典算法做了升级,解决不来单调性的问题
在这里插入图片描述
2.2之后提出了c3算法,可以检测有没有冲突,有二义性就直接报错,非单调要你自己想办法解决,依然会形成一个序列
在这里插入图片描述在这里插入图片描述
通过一个有序的序列解决了继承的搜索问题

对于python的类,属性查找方式,找自个还是什么,用mro来确定去找
在这里插入图片描述
搜索属性的时候就用MRO看一样,就知道怎么样的搜索顺序了
方法这么找,属性也是这么找的

在这里插入图片描述
mro总共有三个算法:
1.深度优先
2.深度优先去重,
3.mro的c3算法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值