# 多继承:
# 在继承关系中.⼦类自动拥有⽗类中除私有属性外其他所有内容.python⽀持多继承.子类可拥有多⽗类.
 class ShenXian: # 神仙

  def fei(self):
print("神仙都会⻜") class Monkey: # 猴 def chitao(self):
print("猴⼦喜欢吃桃⼦") class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是⼀只猴(自己有先自己,然后靠最近的,再其他)
pass # sxz = SunWukong() # 孙悟空
# sxz.chitao() # 会吃桃⼦
# sxz.fei() # 会⻜ # 这就是多继承,但当两个⽗类中出现了重名⽅法的时候.就涉及到如何查找⽗类⽅法的问题.
# 即下面的 MRO(method resolution order) 问题
# 经典类MRO算法:
# 在python2.2之前用,现已弃用(做面试题参考) 采用的树形结构的深度递归遍历
# 方法:从头开始.从左往右,一条道跑到底,然后回头.继续⼀条路跑到头.(画图)
 # 画图排顺序 现用python版本已无法验证
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
class E:
pass
class F(D, E):
pass
class G(F, D):
pass
class H:
pass
class Foo(H, G):
pass # 结果 : FOO--H--G--F--D--B--A--C--E

# 新式类MRO算法(C3):
# 先拆后合 从下向上合并,拿出每一项的头和后一项的身体进行比较.
# 如果出现了就过,从后一项的头继续去比较.如果不出现就出来放到结果。
# (注意:每次都是拿 头一项 的头和后面的身体比较,出现了就过,这时把后一项的头作为头一项继续去比较,
# 若后一项的头在后面身体还有,继续这个操作...直到后面身体没有再返回前面的头,理解成一个循环)
 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__) '''
# 拆 注意别漏了末尾的 “GXF”
# 当类里面只有单个继承时不需要
L(H) = H + L(G) + L(X) + L(F) + GXF HGPMXFDBECANO L(G) = G + L(P) GPMFDBECAN
L(X) = X + L(O) XO
L(F) = F + L(D) + L(E) + DE FDBECA L(P) = P + L(M) + L(N) + MN PMFDBECAN
L(O) = O
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) BA
L(C) = C + L(A) CA
L(A) = A # HGPMXFDBECANO
# super():
# super是查找mro顺序中的下一个
# 单继承中我们可以认为super是对父类中的属性或方法的引入
# super()常用地方:
# 1.访问⽗类的构造⽅法
# 2.⼦类⽅法调⽤⽗类(MRO)中的⽅法
 # 访问⽗类的构造⽅法
class Foo1:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
class Bar(Foo1):
def __init__(self, a, b, c, d):
super().__init__(a, b, c) # 访问⽗类的构造⽅法 对父类中的属性引入
self.d = d b = Bar(1, 2, 3, 4)
print(b.__dict__) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
 # 当⼦类⽅法想调⽤⽗类(MRO)⽅法
class ShengWu:
def dong(self): # 实例方法
print(self)
print("我是生物") class Animal(ShengWu):
pass class Cat(Animal):
def dong(self): # 子类中出现了和父类重名的内容. 表示对父类的方法的覆盖(重写).
super(Animal, self).dong() # 定位到Animal. 找Animal的下一个
# super(类, 对象).方法() 找MRO中的类. 找这个类的下一个. 去执行方法
print("我的猫也会动") # self 依然是谁调用就是谁
# 找MRO中的下一个
# Cat -> Animal -> ShengWu ->Object c = Cat()
print(c)
c.dong()

# 总结 不管super()写在哪⼉.在哪⼉执⾏.⼀定先找MRO列表.根据MRO列表的顺序往下找.否则⼀切都是错的

第二十天- 多继承 经典MRO 新式MRO super()的更多相关文章

  1. 继承 派生 super()经典类 新式类

    '''1什么是继承? 继承一种新建类的方式,在python中支持一个儿子继承多个爹 新建的类称为子类的或者派生类 父类有可以称为基类或者超类 子类会‘遗传’父类的属性 2 为什么要用继承 减少代码冗余 ...

  2. 面向对象:继承(经典类&新式类继承原理、属性查找)、派生

    继承: 继承是指类与类之间的关系,是一种“什么”是“什么”的关系. 继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基 ...

  3. python 面向对象(六)MRO C3算法 super

    ########################总结################ 面向对象回顾 类:对某一个事物的描述,对一些属性和方法的归类 class 类名: var=123#类变量 def ...

  4. 洗礼灵魂,修炼python(43)--巩固篇—经典类/新式类

    经典类 1.什么是经典类 就是在使用class关键词时,括号内不添加object类的就叫经典类,前面的博文里是绝对解析过的,所以你应该知道,经典类现在已经仅存在于python2了,因为python3不 ...

  5. MRO C3算法 super的运用

    -------------态度决定成败,无论情况好坏,都要抱着积极的态度,莫让沮丧取代热心.生命可以价值极高,也可以一无是处,随你怎么去选择.# --------------------------- ...

  6. day19 MRO C3算法 super()

    1. MRO(Method Resolution Order):方法解析顺序,主要用于在多继承时判断调的属性的路径(来自于哪个类). 1.Python语言包含了很多优秀的特性,其中多重继承就是其中之一 ...

  7. Python 中的经典类新式类

    Python 中的经典类新式类 要知道经典类和新式类的区别,首先要掌握类的继承 类的继承的一个优点就是减少代码冗余 广度优先和深度优先,这主要是在多类继承的时候会使用到 经典类和新式类的主要区别就是类 ...

  8. C++继承经典样例

    c++继承经典样例 #include <iostream.h> class Base { private:         int b_number; public:         Ba ...

  9. python面向编程:类继承、继承案例、单继承下属性查找、super方法

    一.类的继承 二.基于继承解决类与类的代码冗余问题 三.在单继承背景下属性的查找 四.super的方法 一.类的继承 1.什么是继承? 在程序中继承是一种新建子类的方法的方式,新创建的类成为子类\派生 ...

随机推荐

  1. FunDA(10)- 用户功能函数模式:User Function Model

    前面我们提过:FunDA就像一个管道(PipeLine).管道内流动着一串数据(Data)或者运算指令(Action).管道的源头就是能产生纯数据的数据源(Source),跟着在管道的中间会有一些节点 ...

  2. 使用jquery怎么选择有两个class的元素?

    实例: 我们想要选择class为:box_list clearfix 的div <div class="box_list clearfix" style="z-in ...

  3. easyUI取消选中的所有行

    在datagrid选择选中行进行展示后,再返回这个datagrid重新加载数据, 原来选中的数据还是保持选中状态.执行以下的方法还是如此,如图. $("#Table").datag ...

  4. MySQL 高级查询操作

    目录 MySQL 高级查询操作 一.预告 二.简单查询 三.显示筛选 四.存储过程 五.查询语句 1.作为变量 2.函数调用 3.写入数据表 备注 附表一 附表二 相关文献 博客提示 MySQL 高级 ...

  5. 【已解决】wepy中使用分包加载报错

    问题: "xxx.js 出现脚本错误后者未正确调用Page()"       最近看小程序启动时间(性能监控),启动时间比较长,所以考虑使用分包加载.       但在使用过程中遇 ...

  6. Android访问网络,使用HttpURLConnection还是HttpClient?

    本文转自:http://blog.csdn.net/guolin_blog/article/details/12452307,感谢这位网友的分享,谢谢. 最近在研究Volley框架的源码,发现它在HT ...

  7. pythonweb框架Flask学习笔记04-模板继承

    # -*- coding:utf-8 -*- from flask import render_template,Flask app=Flask(__name__) @app.route('/hell ...

  8. MATLAB基础操作笔记

    A( i , : ) 表示 A矩阵的第 i 行所有元素 A( : , j ) 表示 A矩阵的第 j 列所有元素 A( : , : ) 表示 A矩阵的 所有元素 定义函数时,函数中有嵌套函数需要在结束时 ...

  9. input验证码框,输入非数字或非12位时,红框提示;每4位加一个空格

    以下代码:input验证码框,输入非数字或非12位时,红框提示;每4位加一个空格 //input验证码框,输入非数字或非12位时,红框提示;每3位加一个空格 $(".text"). ...

  10. J03-Java IO流总结三 《 FileInputStream和FileOutputStream 》

    1. FileInputStream    FileInputStream是一个文件输入节点流,它是一个字节流,它的作用是将磁盘文件的内容读取到内存中. FileInputStream的父类是Inpu ...