一. Python的继承  多继承

  子类继承父类.

  继承是为了节省开发时间.提高开发效率 代码得到了重(chong)用 一个类可以拥有多个父类

lass shen_xian:  #  定义一个神仙类
def fei(self): # 神仙类有一个方法 可以飞
print('神仙都会飞')
class Monkey: # 定义一个猴子类
def chitao(self): # 猴子有一个方法 可以吃桃子
print('猴子喜欢吃桃')
class SunWuKong(Monkey,shen_xian): # 对象继承猴子和神仙的类型
pass
sxz = SunWuKong() # 实例化一个孙悟空对象
sxz.chitao() # 会吃桃子
sxz.fei() # 会飞

  多继承用起来简单 但是存在一个问题 当父类中出现重名方法时 就涉及到查找父类方法中的问题 也即MRO(method resolution order)

二. 经典类的MRO

  在Python2中存在两种类

    经典类 : 在Python 2.2 之前 一直使用的是 经典类

    新式类 : 在2.2之后 出现了新式类 特点是 基类的根是object

  Python 3

    只有新式类  如果基类谁都不继承 那么会默认继承object

  经典类的MRO 深度优先遍历 例如 快递员送鸡蛋 :

  肯定是按照123456顺序来送 即每次都是最左边 找完撤回到分叉口继续往里找(从左往右,一条道跑到黑,然后撤回继续一条道跑到黑) 即深度优先遍历   如果 142356 就是广度优先遍历

三. 新式类的MRO, C3(重点, 难点)  可以通过 类名.__mro__ 获取到类的mro信息

  即print(类名.__mro__) 就可以获取到

    Python中的新式类的mro都是用 c3算法来完成的

        笔试的时候肯定会考

  新式类中摒弃了(部分). C3算法

  如果继承关系没有菱形继承(深度优先)

  如果有菱形:使用C3算法来计算MRO

三. super

  super()可以执行 mro中的下一个父类的方法 通常super()有两个使用的地方 :

    1 . 可以访问父类的构造方法

    2 . 当子类方法想调用父类(mro)中的方法

    先看第一种

class Foo:
def __init__(self,a,b,c):
self.a = a
self.b = b
self.c = c
class Bar(Foo):
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}

  这样就方便了子类 不需要写那么多了

  第二种

class Foo:
def func1(self):
super().func1() # 此时找的是mro顺序中下一个类的func1()方法 实际到这就会报错 根本不会运行
# 因为 Foo 中没有func1方法 继承的obj中也没有func1()方法
print('我的老家,就住在这个屯')
class Bar:
def func(self):
print('你的老家,不在这个屯')
class Ku(Foo,Bar):
def func1(self):
super().func1()
print('它的老家,不知道在哪个屯')
k = Ku() # 先看mro Ku , Foo, Bar ,object
k.func1() k2 = Foo() # 此时的mro Foo , object 都没有func1 因此会报错 如果这样写一开始就会报错 就不会运行到这才报错
k2.func1()

五. 一道面试题

# mro + super 面试题
class Init:
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
p = Incr(5)
print(p.val)
c = Add2(2)
print(c.val)

  结论 : 不管super()写在哪. 在哪执行,一定先找到mro列表.根据mro列表的顺序往下找 否则都是错的.

C3算法 和 super的更多相关文章

  1. MRO和C3算法

    本节主要内容: 1.python多继承 2.python经典类的MRO 3.python新式类的MRO,C3算法 4.super() 一.python多继承 在python中类与类之间可以有继承关系, ...

  2. day21 MRO和C3算法

    核能来袭 --MRO和C3算法 1. python的多继承 2.python经典类的MRO 3.python新式类的MRO, C3算法 4.super 是什么鬼? 一.python的多继承 在前面的学 ...

  3. python学习 day20 (3月27日)----(单继承多继承c3算法)

    继承: 提高代码的重用性,减少了代码的冗余 这两个写法是一样的 Wa('青蛙').walk() #青蛙 can walk wa = Wa('青蛙') wa.walk() #青蛙 can walk 1. ...

  4. MRO C3算法 super的运用

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

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

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

  6. day19 MRO C3算法 super()

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

  7. super之mro列表牵引出c3算法

    目录 一:super的使用 二:super之mro列表牵引出c3算法 三:mro列表总结使用 一:super的使用 class Person(object): def __init__(self, n ...

  8. python小兵 面向对象继承super和c3算法

    python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使⽤继承关系. 即"is-a" 关系. 在继承 ...

  9. 手推C3算法

    C3算法规则 -- 每一个类的继承顺序都是从基类向子类看 -- 形成一个指向关系的顺序[当前类] + [父类的继承顺序] -- 进行一个提取 -- 如果一个类出现从左到右的第一个顺序上,并且没有出现在 ...

随机推荐

  1. 批处理基本知识以及进阶 V2.0

    批处理基本知识以及进阶 将以要执行的程序指令 , 像在 dos 模式下一下写入记事本 , 保存成 bat 文件 , 就可以执行了 一 . 简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求 ...

  2. ROS Learning-026 (提高篇-004 A Mobile Base-02) 控制移动平台 --- “分封制”

    ROS 提高篇 之 A Mobile Base-02 - 控制移动平台 - "分封制" 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ub ...

  3. latex公式怎么变成图片格式

    由于这几天正在复习高中的数学,想写一些博客记录一下,发现数学公式的输入是一个问题,后来知道了latex,去youtube学习了一点入门教程发现挺简单的,不过有一个问题,latex生成的是pdf格式啊, ...

  4. Luogu 1314 [NOIP2011] 聪明的质监员

    二分答案 + 前缀和. 题面中式子的意思是每一个区间$[l, r]$的贡献是这个区间内$w_i \geq W$的个数乘以这些$i$的$v_i$和. 很快发现了答案具有单调性,可以做两遍二分,分别看看小 ...

  5. Ubuntu学习小结(二)PostgreSQL的使用,进程的查看关闭,编辑器之神Vim入门

    距离上次发布文章已经过去了很久.在过去的半年中,虽然写的代码不多,但是在接触了计算机一些其他的知识,包括数据库.网络之后,感觉能够融会贯通,写代码水平又有了一定的提高.接下来,将会发表几篇文章,简单介 ...

  6. CodeSmith链接MySQL

    环境:Win7 x64 旗舰版 CodeSmith Generator Professional 6.5.0 MySQL 5.6.17 x64 在CodeSmith中按一般步骤创建数据库连接 Data ...

  7. SingleClass单例类

    前言 对于一个单例类,无论初始化单例对象多少次,在程序的整个生命周期内,只会创建一个类的实例对象,而且只要程序不被杀死,该实例对象就不会被释放,并且该对象是全局的,能够被整个系统访问到. 在应用这个模 ...

  8. Linux基础学习(二)

    前言: 我们在上一节了解了一下linux的硬件组成,虽然也许对具体的东西还不甚了解,但是我们知道了linux下一切皆文件这一特性 我们装好了CentOS7的虚拟机(这个可以看别人教程来装起来,比较简单 ...

  9. Java异常处理方式

    前言 平时在开发的时候避免不了的出一些大大小小的不同类型的错误,这时候,对于这些异常怎么处理呢,显得至关重要了. 内容 分类 Trowable:有两个重要的子类,Exception(异常)和Error ...

  10. 【以太坊开发】区块链中的预言机:Oraclize原理介绍

    智能合约的作用很多,但是很多数据还是要基于互联网,那么如何在合约中获取互联网中的数据?Oraclize就是为了这个目的而诞生的. 工作原理: 智能合约通过对Oraclize发布一个合约之间的调用请求来 ...