# 多继承:
# 在继承关系中.⼦类自动拥有⽗类中除私有属性外其他所有内容.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. Gson简单使用

    最近做个IM类型的Android 应用,由于有三种客户端(pc,ios,Android),所以底层使用的是C++与服务器通信,所以通信部分基本上有c++完成,封装好Jni即可,可以把底层c++通信看成 ...

  2. AFNetworking 报3840

    工作中遇到前后台交互,前端解析不了后端返回的数据格式 ,原因在于没有标准统一的请求格式 这是个坑,但是还是有办法修复 错误提示: Error Domain=NSCocoaErrorDomain Cod ...

  3. css实现响应式九宫格效果

    1. 首先看下九宫格的效果图: 2. html代码比较简单,如下: <div class="main"> <div class="box1"& ...

  4. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  5. 用COS实现文件上传

    cos是O'Rrilly公司开发的一款用于HTTP上传文件的OpenSource组件 需要cos.jar,下载地址:http://www.servlets.com/cos/ cos上传文件很简单,比f ...

  6. Hadoop HDFS概念学习系列之HDFS升级和回滚机制(十二)

    不多说,直接上干货! HDFS升级和回滚机制 作为一个大型的分布式系统,Hadoop内部实现了一套升级机制,当在一个集群上升级Hadoop时,像其他的软件升级一样,可能会有新的bug或一些会影响现有应 ...

  7. nlp 总结 分词,词义消歧,词性标注,命名体识别,依存句法分析,语义角色标注

    分词 中文分词 (Word Segmentation, WS) 指的是将汉字序列切分成词序列. 因为在汉语中,词是承载语义的最基本的单元.分词是信息检索.文本分类.情感分析等多项中文自然语言处理任务的 ...

  8. PyCharm2018专业版激活步骤

    激活步骤: 1.更改hosts文件,2 获取注册码,  3 完成注册. 1. 更改host文件 hosts文件的路径 : c:\windows\system32\drivers\etc\hosts 将 ...

  9. kendo UI 入门

    Kendo UI 是一套前端开发宽假,意为日本的“剑道” 首先到官方网站下载最新的30天试用版,地址为:http://www.telerik.com/download/kendo-ui 需要简单注册一 ...

  10. CentOS SVN Failed to load JavaHL Library

    在CentOS 6上的eclipse安装了svbclipse插件后,svn不能使用,并且第一次使用的时候还出现下面错误窗口提示 Failed to load JavaHL Library. These ...