内容梗概:
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算法的更多相关文章

  1. Python 基础之面向对象类的继承与多态

    一.继承 定义:一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法继承: 1.单继承 2.多继承子类: 一个类继承了另外一个类,那么这个类是子类(衍生类)父类:一个类继承了另外一个类,被继 ...

  2. Python基础之面向对象3(继承)

    一.继承相关概念 1.语法: 2.定义: 3.优缺点: 4.相关概念: 5.相关内置函数: 6.继承内存图: 7.多继承: 二.多态相关概念 1.定义及作用: 2.重写概念: 3.运算符重载: 定义: ...

  3. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  4. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  5. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  6. [.net 面向对象编程基础] (12) 面向对象三大特性——继承

    [.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...

  7. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  8. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  9. python基础(24):面向对象三大特性一(继承)

    1. 继承 1.1 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继 ...

随机推荐

  1. 【分片无法挂载】Elasticsearch分片和副本无法挂载(分片移位)

    部署说明 硬件 服务器两台: 机器A:64G内存 机器B:32G内存 分片 共12个节点 2个查询节点,10个存储节点 8个主分片 1个复制分片(每个分片都有一个副本分布在不同的节点上面) 每台机器都 ...

  2. dp专题练习

    顺便开另外一篇放一些学过的各种dp dp总结:https://www.cnblogs.com/henry-1202/p/9194066.html 开坑先放15道题,后面慢慢补 目标50道题啦~~,目前 ...

  3. echarts获取数据的一些难点1

    像上面获取数据后,如果再根据下方按钮查询不同获取的价格,虽然曲线价格能按照不同的来展示, 但是问题有: 查询到的company字段虽然在获取的data中能测试出,但是在上方填入这些companys后, ...

  4. [nginx] - 使用nginx实现反向代理,动静分离,负载均衡,session共享

    反向代理概念 先说正向代理,比如要访问youtube,但是不能直接访问,只能先找个FQ软件,通过FQ软件才能访问youtube. FQ软件就叫做正向代理.所谓的反向代理,指的是用户要访问youtube ...

  5. 洛谷P2782 友好城市 DP

    やはり まだあしたということは嘘でしょう.ぜんぶ忘れた( ´・ヮ・`) 所以今天就贴一道水题吧 原题>>https://www.luogu.org/problem/show?pid=278 ...

  6. 基于 Python 和 Pandas 的数据分析(5) --- Concatenating and Appending

    这一节我们将会介绍几种不同的合并数据的方法. 在我们这个不动产投资的例子中, 我们希望获取 51 个州的房产数据, 并把它们组合起来. 我们这样做有很多原因. 这样做既便于我们做分析, 同时也可以占用 ...

  7. Codeforces 629 E. Famil Door and Roads

    题目链接:http://codeforces.com/problemset/problem/629/E 询问这个简单环的期望.考虑将这个环拆成两部分. 令${deep[x]>=deep[y]}$ ...

  8. python 传递多个参数

    def oper(a,*args): print(args) print(a) oper("q","s","d","z" ...

  9. VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别

    在使用VMware Workstation(以下简称:VMware)创建虚拟机的过程中,配置虚拟机的网络连接是非常重要的一环,当我们为虚拟机配置网络连接时,我们可以看到如下图所示的几种网络连接模式:桥 ...

  10. 服务器不能设置内容类型HTTP头信息后发送

    昨天一个用户反映,导出excel失败,我测试了一下,数据量小没有问题,数据量稍微大就会出现这个问题.咨询度娘也没有找到合适的解决方法,突然想到系统中,其他模块有下载excel附件的功能,但是从没有出现 ...