类的多继承

一个类可以继承多个无关的类. 一个类可以被多个无关的类继承

1.经典类. 在python2.2之前. 已经是历史了. MRO 采用的是树形结构的深度递归遍历(一条道跑到黑)


2.新式类  在2.2之后产生新式类.  目前我们使用的. 所有的类的根都是object C3算法(merge)
#2 新式类的MRO 算法
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__) #直接可以通过 print(类名.__mro_) 求某个类的mro 值 # #计算过程:
# 原则 :合并. 从下向上合并. 拿出每一项的头和后一项的身体进行比较. 如果出现了. 就过, 从后一项的头继续去比较. 如果不出现就出来 # 结果为 HGPMXFDBECANO
#设L为查找方法的MRO顺序
# L(H) = H + L(G) + L(X) + L(F) + GXF HGPMXFDBECANO
#
# 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 # ECA ECA E MFDBECA
#
# '''
#
#
# '''
# L(H) = H + L(G) + X+ L(F) HGPMFDBECAN FDBECA
#
# L(G) = G + L(P) GPMFDBECAN
# L(F) = F + L(D) + L(E) FDBECA
#
# L(P) = P + L(M) + L(N) PMFDBECAN
# L(D) = D + L(B) + L(C) DBCA
# L(E) = E + L(C) + L(A) ECA
#
# L(M) = M + L(F) + L(E) MFDBECA
# L(N) = N
# L(B) = B + L(A) BA
# L(C) = C + L(A) CA
#
# L(A) = A # 新式类通过__mro__可以直接看到MRO的结果

MRO C3算法

3. super      MRO 的下一位

# super是查找mro顺序中的下一个
# 单继承中我们可以认为super是对父类中的属性或方法的引入 class ShengWu:
def dong(self): # 实例方法
print(self)
print("我是生物") class Animal(ShengWu):
pass class Cat(Animal):
def dong(self): # 子类中出现了和父类重名的内容. 表示对父类的方法的覆盖(重写). 半盖(java)
super(Animal, self).dong() # 定位到Animal. 找Animal的下一个
# super(类, 对象).方法() 找到MRO中的类. 找这个类的下一个. 去执行方法
print("我的猫也会动") # 找MRO中的下一个
# Cat -> Animal -> ShengWu

super

4.面试题

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) # 5.0
self.val += 2 # 7.0
class Mult(Init):
def __init__(self, val):
print("Mult")
super(Mult, self).__init__(val)
self.val *= 5 # 5.0
class HaHa(Init):
def __init__(self, val):
print("哈哈")
super(HaHa, self).__init__(val)
self.val /= 5 # 1.0
class Pro(Add2,Mult,HaHa): #
pass
class Incr(Pro):
def __init__(self, val): #
super(Incr, self).__init__(val)
self.val += 1 # 8.0 '''
add2
Mult
哈哈
init
5.0
8.0
Add2
init
2
4 ''' # Incr, pro, add2, mult, haha, Init
p = Incr(5)
print(p.val) # ?
# Add2 init
c = Add2(2)
print(c.val) # ?

MRO + super ⾯试题

 

20 多继承 MRO 算法 深度优先遍历 super的更多相关文章

  1. Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)

    Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...

  2. Python大神必须掌握的技能:多继承、super和MRO算法

    本文主要以Python3.x为例讲解Python多继承.super以及MRO算法. 1. Python中的继承 任何面向对象编程语言都会支持继承,Python也不例外.但Python语言却是少数几个支 ...

  3. python摸爬滚打之day20--多继承,MRO和C3算法

    1.新式类和经典类 在python2.2之前, 基类如果不写(), 则表示为经典类; 在python2.2之后, 经典类不复存在, 只存在新式类. 如果基类谁都不继承的话, 则默认继承object. ...

  4. python基础之面向对象的多继承以及MRO算法

    内容梗概: 1. python多继承 2. python经典类的MRO 3. python新式类的MRO C3算法 1.python多继承 class Shen: def fly(self): pri ...

  5. Python 多继承(新式类) 的mro算法

    转载自:http://www.cnblogs.com/panyinghua/p/3283831.html mro即method resolution order,主要用于在多继承时判断调的属性的路径( ...

  6. 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...

  7. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

  8. Python多继承之MRO算法

    MRO即Method Resolution Order   方法解析顺序,它的提出主要是为了解决Python中多继承时,当父类存在同名函数时,二义性的问题 下面先看一个例子: import inspe ...

  9. 图的建立(邻接矩阵)+深度优先遍历+广度优先遍历+Prim算法构造最小生成树(Java语言描述)

    主要参考资料:数据结构(C语言版)严蔚敏   ,http://blog.chinaunix.net/uid-25324849-id-2182922.html   代码测试通过. package 图的建 ...

随机推荐

  1. linux常用命令:chown 命令

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  2. 教你如何在linux下查看服务是否已经启动或者关闭

    1. # ps aux | grep 服务名称(ps 的参数是可以颠倒使用没问题) 2. # netstat -tunple | grep 服务端口 3.bind() 80 in using 代表的含 ...

  3. Python之路----生成器函数进阶

    def generator(): print(123) yield 1 print(456) yield 2 g = generator() ret = g.__next__() print('*** ...

  4. Hive-复制表

    非分区表复制 复制一张非分区表,使用CREATE TABLE IF NOT EXISTS AS SELECT * FROM tb_name;只复制表结构,CREATE TABLE IF NOT EXI ...

  5. Python3基础 str """ 多行字符串

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  6. jquery hover最后解决 - 不再疑惑 - 例子在这里

    hover具有动画累计的bug, 可以使用 stop 或 filter(:not(:animated))来消除, 但是, 即使这样, 当鼠标反复滑入或滑出的时候, 虽然没有动画累计的问题, 但是 下面 ...

  7. pip 更换国内镜像与记录

    更换pip源到国内镜像 阿里云 http://mirrors.aliyun.com/pypi/simple/   中国科技大学 https://pypi.mirrors.ustc.edu.cn/sim ...

  8. win7下配置IIS

    Internet Information Services(IIS,互联网信息服务),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是Windows NT版本的可选 ...

  9. 【附12】grafana配置文件

    一.配置文件位置 /usr/local/opt/grafana/share/grafana/default.ini /usr/local/etc/grafana/grafana.ini 二.init格 ...

  10. ajax post 参数说明