当前位置: 首页 > news >正文

C3算法 和 super

一. 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)
View Code

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

转载于:https://www.cnblogs.com/f-g-f/p/9729064.html

相关文章:

  • There are stopped jobs
  • RabbitMQ 运转流程
  • 通俗易懂系列 | 设计模式(三):适配器模式
  • 信用评分卡 (part 4 of 7)
  • 浅谈贪心算法2
  • 开启新篇章-2018.10.04
  • Unity3D_(物理引擎)Rigidbody组件
  • 四则运算1.0
  • Visiual Studio2012 CLR20r3问题
  • linux 中对 mysql 数据库的基本命令
  • 前端页面添加表格,实现每一行能上下移动,还可修改数据库排序字段值
  • 数字转换(求树的直径)
  • 初识 vue —— 最简单的前后端交互示例
  • [orleans2.1]这是你没玩过的船新版本
  • 微信小程序picker下拉绑定数据
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2017前端实习生面试总结
  • Hibernate【inverse和cascade属性】知识要点
  • iOS 颜色设置看我就够了
  • Java 23种设计模式 之单例模式 7种实现方式
  • javascript面向对象之创建对象
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • 包装类对象
  • 彻底搞懂浏览器Event-loop
  • 日剧·日综资源集合(建议收藏)
  • 什么是Javascript函数节流?
  • 试着探索高并发下的系统架构面貌
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Java总结 - String - 这篇请使劲喷我
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​2021半年盘点,不想你错过的重磅新书
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #stm32驱动外设模块总结w5500模块
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (12)Linux 常见的三种进程状态
  • (4)(4.6) Triducer
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Forward) Music Player: From UI Proposal to Code
  • (第一天)包装对象、作用域、创建对象
  • (附源码)ssm高校实验室 毕业设计 800008
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .a文件和.so文件
  • .libPaths()设置包加载目录
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net分布式压力测试工具(Beetle.DT)
  • .NET学习教程二——.net基础定义+VS常用设置
  • ::什么意思