1. 内容梗概:
    1. python多继承
    2. python经典类的MRO
    3. python新式类的MRO C3算法
  2.  
  3. 1.python多继承
  1. class Shen:
  2. def fly(self):
  3. print("大神会飞")
  4. class Hou:
  5. def chi(self):
  6. print("猴子吃桃子")
  7. class SunWuKong(Shen, Hou): # 一个类可以继承多个无关的类. 一个类可以被多个无关的类继承
  8. pass
  9. class TaiShangLaoJun(Shen):
  10. pass
  11. swk = SunWuKong()
  12. swk.fly()
  13. swk.chi()
  1. 2. 经典类的MRO
    在经典类中采用的是深度优先遍历方案.什什么是深度优先.就是一条路路走到头.然后再回来.继续找下一个
  2.  
  3. 三. 新式类的MRO
  4.  
  5. 实例1
  1. class A:
  2. pass
  3. class B(A):
  4. pass
  5. class C(A):
  6. pass
  7. class D(B, C):
  8. pass
  9. class E(C, A):
  10. pass
  11. class F(D, E):
  12. pass
  13. class M(F, E):
  14. pass
  15. class N:
  16. pass
  17. class P(M,N):
  18. pass
  19. class G(P):
  20. pass
  21. class H(G, F):
  22. pass
  23. print(H.__mro__)
  24. L(H) = H + L(G) + L(F) + GF HGPMFDBECAN
  25. L(G) = G + L(P) + P GPMFDBECAN
  26. L(F) = F + L(D)+ L(E) + DE FDBECA
  27.  
  28. L(P) = P + L(M) + L(N) + MN PMFDBECAN
  29. L(D) = D + L(B) + L(C) + BC DBCA
  30. L(E) = E + L(C) + L(A) + CA ECA
  31.  
  32. L(M) = M + L(F) + L(E) + FE MFDBECA
  33. L(N) = N
  34. L(B) = B + L(A) + A BA
  35. L(C) = C + L(A) + A CA
  36. L(A) = A
  1.  
  2. 实例2
  1. class A:
  2. pass
  3. class B(A):
  4. pass
  5. class C(A):
  6. pass
  7. class D(B, C):
  8. pass
  9. class E(C, A):
  10. pass
  11. class F(D, E):
  12. pass
  13. class M(F, E):
  14. pass
  15. class N:
  16. pass
  17. class P(M,N):
  18. pass
  19. class G(P):
  20. pass
  21. class O:
  22. pass
  23. class X(O):
  24. pass
  25. class H(G, X, F):
  26. pass
  27. print(H.__mro__)
  28.  
  29. L(H) = H + L(G) + L(X) + L(F) + GXF HGPM XFDB ECA NO
  30.  
  31. L(G) = G + L(P) + P GPMFDBECAN
  32. L(X) = X + L(O) + O XO
  33. L(F) = F + L(D) + L(E) + DE FDBECA
  34.  
  35. L(P) = P + L(M) + L(N) + MN PMFDBECAN
  36. L(D) = D + L(B) + L(C) + BC DBCA
  37. L(E) = E + L(C) + L(A) + CA ECA
  38.  
  39. L(M) = M + L(F) + L(E) + FE MFDBECA
  40. L(N) = N N
  41. L(B) = B + L(A) + A BA
  42. L(C) = C + L(A) + A CA
  43. L(A) = A
  1. 4. super是什么鬼?
    super()可以帮我们执行MRO中下一个父类的⽅方法. 通常super()有两个使用的地方:
    1. 可以访问父类的构造方法
    2. 当子类方法想调⽤父类(MRO)中的方法
  2.  
  3. super是查找mro顺序中的下一个
    单继承中我们可以认为super是对父类中的属性或方法的引入
  4.  
  5. 实例:
  1. class ShengWu:
  2. def dong(self): # 实例方法
  3. print("我是生物")
  4. class Animal(ShengWu):
  5. def chi(self): # 实例方法
  6. print("我是动物")
  7. class Cat(Animal):
  8. def dong(self): # 子类中出现了和父类重名的内容. 表示对父类的方法的覆盖(重写). 半盖(java)
  9. super(Animal, self).dong() # 定位到Animal. 找Animal的下一个(第三层) py2的写法
  10. super().dong() # 直接跳到第三层 ,py3的写法
  11. super().chi() # 跳到第二层 ,py3的写法
  12. super(类, 对象).方法() 找到MRO中的类. 找这个类的下一个.去执行方法
  13. print("我的猫也会动")
  14. MRO中的下一个
  15. Cat -> Animal -> ShengWu
  16.  
  17. c = Cat()
  18. print(c)
  19. c.dong()
  1. 补充:
    # MRO + super ⾯面试题
  1. class Init(object):
  2. def __init__(self, v):
  3. print("init")
  4. self.val = v
  5. class Add2(Init):
  6. def __init__(self, val):
  7. print("Add2")
  8. super(Add2, self).__init__(val)
  9. print(self.val)
  10. self.val += 2
  11. class Mult(Init):
  12. def __init__(self, val):
  13. print("Mult")
  14. super(Mult, self).__init__(val)
  15. self.val *= 5
  16. class HaHa(Init):
  17. def __init__(self, val):
  18. print("哈哈")
  19. super(HaHa, self).__init__(val)
  20. self.val /= 5
  21. class Pro(Add2,Mult,HaHa): #
  22. pass
  23. class Incr(Pro):
  24. def __init__(self, val):
  25. super(Incr, self).__init__(val)
  26. self.val+= 1
  27. # Incr Pro Add2 Mult HaHa Init
  28. p = Incr(5)
  29. print(p.val)
  30. c = Add2(2)
  31. print(c.val)
  32. 提示. 先算MRO.然后看清楚self是谁.
  33. 结论: 不管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. CodeForces 509C Sums of Digits(贪心乱搞)题解

    题意:a是严格递增数列,bi是ai每一位的和,告诉你b1~bn,问你怎样搞才能让an最小 思路:让ai刚好大于ai-1弄出来的an最小.所以直接模拟贪心,如果当前位和前一个数的当前位一样并且后面还能生 ...

  2. Gym 101775J Straight Master(差分数组)题解

    题意:给你n个高度,再给你1~n每种高度的数量,已知高度连续的3~5个能消去,问你所给的情况能否全部消去:例:n = 4,给出序列1 2 2 1表示高度1的1个,高度2的2个,高度3的2个,高度4的1 ...

  3. POJ-1038 Bugs Integrated, Inc. (状压+滚动数组+深搜 的动态规划)

    本题的题眼很明显,N (1 <= N <= 150), M (1 <= M <= 10),摆明了是想让你用状态压缩dp. 整个思路如下:由于要填2*3或者3*2的芯片,那么就要 ...

  4. Kylin知识点介绍

    Kylin is an open source Distributed Analytics Engine from eBay Inc.that provides SQL interface and m ...

  5. 在centos6中编译安装httpd-2.4/搭建LAMP

    首先确保centos6安装平台安装一下环境: #yum groupinstall "Development  Tools" "Server Platform Develo ...

  6. MVC ---- 去掉HTML过滤

    在方法头上添加特效  [ValidateInput(false)]  富文本框提交的内容就可以顺利提交到后台了.

  7. 【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 ...

  8. 树莓派 无屏幕 安装Ubuntu系统 无头安装 无显示器 用网线

    能看到此篇博客的人说明都尝试失败了,会发现内存卡刷入Ubuntu后,无法通过ssh操作树莓派.是因为官方的ubuntu系统在初次运行时需要设定一些东西,类似windows第一次启动也需要设置那样,如果 ...

  9. VirtualBox-- 虚拟机网络设置2--主机与虚拟机互相访问且均上外网

    转载自:http://blog.sina.com.cn/s/blog_7de9d5d80100t2uw.html   VirtualBox中有4中网络连接方式:NATBridged AdapterIn ...

  10. java常用技术名词解析

    1.1 token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便 将此Token返回给客户端,以后客户端只需带上这个Token前来请求数 ...