python基础之面向对象的多继承以及MRO算法
- 内容梗概:
1. python多继承
2. python经典类的MRO
3. python新式类的MRO C3算法- 1.python多继承
- class Shen:
- def fly(self):
- print("大神会飞")
- class Hou:
- def chi(self):
- print("猴子吃桃子")
- class SunWuKong(Shen, Hou): # 一个类可以继承多个无关的类. 一个类可以被多个无关的类继承
- pass
- class TaiShangLaoJun(Shen):
- pass
- swk = SunWuKong()
- swk.fly()
- swk.chi()
- 2. 经典类的MRO
在经典类中采用的是深度优先遍历方案.什什么是深度优先.就是一条路路走到头.然后再回来.继续找下一个- 三. 新式类的MRO
- 实例1
- class A:
- pass
- class B(A):
- pass
- class C(A):
- pass
- class D(B, C):
- pass
- class E(C, A):
- pass
- class F(D, E):
- pass
- class M(F, E):
- pass
- class N:
- pass
- class P(M,N):
- pass
- class G(P):
- pass
- class H(G, F):
- pass
- print(H.__mro__)
- L(H) = H + L(G) + L(F) + GF HGPMFDBECAN
- L(G) = G + L(P) + P GPMFDBECAN
- L(F) = F + L(D)+ L(E) + DE FDBECA
- L(P) = P + L(M) + L(N) + MN PMFDBECAN
- L(D) = D + L(B) + L(C) + BC DBCA
- L(E) = E + L(C) + L(A) + CA ECA
- L(M) = M + L(F) + L(E) + FE MFDBECA
- L(N) = N
- L(B) = B + L(A) + A BA
- L(C) = C + L(A) + A CA
- L(A) = A
- 实例2
- class A:
- pass
- class B(A):
- pass
- class C(A):
- pass
- class D(B, C):
- pass
- class E(C, A):
- pass
- class F(D, E):
- pass
- class M(F, E):
- pass
- class N:
- pass
- class P(M,N):
- pass
- class G(P):
- pass
- class O:
- pass
- class X(O):
- pass
- class H(G, X, F):
- pass
- print(H.__mro__)
- L(H) = H + L(G) + L(X) + L(F) + GXF HGPM XFDB ECA NO
- L(G) = G + L(P) + P GPMFDBECAN
- L(X) = X + L(O) + O XO
- L(F) = F + L(D) + L(E) + DE FDBECA
- L(P) = P + L(M) + L(N) + MN PMFDBECAN
- L(D) = D + L(B) + L(C) + BC DBCA
- L(E) = E + L(C) + L(A) + CA ECA
- L(M) = M + L(F) + L(E) + FE MFDBECA
- L(N) = N N
- L(B) = B + L(A) + A BA
- L(C) = C + L(A) + A CA
- L(A) = A
- 4. super是什么鬼?
super()可以帮我们执行MRO中下一个父类的⽅方法. 通常super()有两个使用的地方:
1. 可以访问父类的构造方法
2. 当子类方法想调⽤父类(MRO)中的方法- super是查找mro顺序中的下一个
单继承中我们可以认为super是对父类中的属性或方法的引入- 实例:
- class ShengWu:
- def dong(self): # 实例方法
- print("我是生物")
- class Animal(ShengWu):
- def chi(self): # 实例方法
- print("我是动物")
- class Cat(Animal):
- def dong(self): # 子类中出现了和父类重名的内容. 表示对父类的方法的覆盖(重写). 半盖(java)
- super(Animal, self).dong() # 定位到Animal. 找Animal的下一个(第三层) py2的写法
- super().dong() # 直接跳到第三层 ,py3的写法
- super().chi() # 跳到第二层 ,py3的写法
- super(类, 对象).方法() 找到MRO中的类. 找这个类的下一个.去执行方法
- print("我的猫也会动")
- 找MRO中的下一个
- Cat -> Animal -> ShengWu
- c = Cat()
- print(c)
- c.dong()
- 补充:
# MRO + super ⾯面试题
- class Init(object):
- def __init__(self, v):
- print("init")
- self.val = v
- class Add2(Init):
- def __init__(self, val):
- print("Add2")
- super(Add2, self).__init__(val)
- print(self.val)
- self.val += 2
- class Mult(Init):
- def __init__(self, val):
- print("Mult")
- super(Mult, self).__init__(val)
- self.val *= 5
- class HaHa(Init):
- def __init__(self, val):
- print("哈哈")
- super(HaHa, self).__init__(val)
- self.val /= 5
- class Pro(Add2,Mult,HaHa): #
- pass
- class Incr(Pro):
- def __init__(self, val):
- super(Incr, self).__init__(val)
- self.val+= 1
- # Incr Pro Add2 Mult HaHa Init
- p = Incr(5)
- print(p.val)
- c = Add2(2)
- print(c.val)
- 提示. 先算MRO.然后看清楚self是谁.
- 结论: 不管super()写在哪儿.在哪儿执行. 一定先找到MRO列表 根据MRO列列表的顺序往下找.否则⼀一切都是错的
python基础之面向对象的多继承以及MRO算法的更多相关文章
- Python 基础之面向对象类的继承与多态
一.继承 定义:一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法继承: 1.单继承 2.多继承子类: 一个类继承了另外一个类,那么这个类是子类(衍生类)父类:一个类继承了另外一个类,被继 ...
- Python基础之面向对象3(继承)
一.继承相关概念 1.语法: 2.定义: 3.优缺点: 4.相关概念: 5.相关内置函数: 6.继承内存图: 7.多继承: 二.多态相关概念 1.定义及作用: 2.重写概念: 3.运算符重载: 定义: ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- [.net 面向对象编程基础] (12) 面向对象三大特性——继承
[.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
- python基础(24):面向对象三大特性一(继承)
1. 继承 1.1 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继 ...
随机推荐
- CodeForces 509C Sums of Digits(贪心乱搞)题解
题意:a是严格递增数列,bi是ai每一位的和,告诉你b1~bn,问你怎样搞才能让an最小 思路:让ai刚好大于ai-1弄出来的an最小.所以直接模拟贪心,如果当前位和前一个数的当前位一样并且后面还能生 ...
- Gym 101775J Straight Master(差分数组)题解
题意:给你n个高度,再给你1~n每种高度的数量,已知高度连续的3~5个能消去,问你所给的情况能否全部消去:例:n = 4,给出序列1 2 2 1表示高度1的1个,高度2的2个,高度3的2个,高度4的1 ...
- POJ-1038 Bugs Integrated, Inc. (状压+滚动数组+深搜 的动态规划)
本题的题眼很明显,N (1 <= N <= 150), M (1 <= M <= 10),摆明了是想让你用状态压缩dp. 整个思路如下:由于要填2*3或者3*2的芯片,那么就要 ...
- Kylin知识点介绍
Kylin is an open source Distributed Analytics Engine from eBay Inc.that provides SQL interface and m ...
- 在centos6中编译安装httpd-2.4/搭建LAMP
首先确保centos6安装平台安装一下环境: #yum groupinstall "Development Tools" "Server Platform Develo ...
- MVC ---- 去掉HTML过滤
在方法头上添加特效 [ValidateInput(false)] 富文本框提交的内容就可以顺利提交到后台了.
- 【Mysql】【Navicat For Mac】Navicat Premium for Mac v12.0.23 + macOS Sierra 10.12.6
参考地址:https://blog.csdn.net/womeng2009/article/details/79700667 [备注]我只用到了部分信息,就激活了 内容: Navicat Premiu ...
- 树莓派 无屏幕 安装Ubuntu系统 无头安装 无显示器 用网线
能看到此篇博客的人说明都尝试失败了,会发现内存卡刷入Ubuntu后,无法通过ssh操作树莓派.是因为官方的ubuntu系统在初次运行时需要设定一些东西,类似windows第一次启动也需要设置那样,如果 ...
- VirtualBox-- 虚拟机网络设置2--主机与虚拟机互相访问且均上外网
转载自:http://blog.sina.com.cn/s/blog_7de9d5d80100t2uw.html VirtualBox中有4中网络连接方式:NATBridged AdapterIn ...
- java常用技术名词解析
1.1 token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便 将此Token返回给客户端,以后客户端只需带上这个Token前来请求数 ...