一:python多继承

 python多继承中,当一个类继承了多个父类时候,这个类拥有多个父类的所欲非私有的属性
l例子:
class A:
pass
class B(A):
pass
class C(A,B):
pass
B继承了A的属性,C继承了A和B的属性

二:多继承中出现的问题:

    问题一:当一个类继承了多个父类,而这几个父类里面的方法名字写的一样,那该怎么办呢?
 例如:
class A:
def login(self):
pass
class B(A):
def login(self):
pass
class C(A,B):
def a(self):
pass
这种情况下怎么去找呢? 这就涉及到了怎么查找父类的方法:
  MRO(method resolution order) 方法
有两个查找版本:一个是python 2.2版本的经典类, 一个是python3版本后的C3算法
经典版本MRO的查找原则,从左到右,先把左边的一条路找完,再回来继续找下一个(一条路走到黑)
新式的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 G(E):
pass
class H(G, F):
pass 首先先. 我们要确定从H开始找. 也就是说. 创建的是H的对象.
如果从H找. 那找到H+H的⽗类的C3, 我们设C3算法是L(x) , 即给出x类. 找到x的MRO
L(H) = H + L(G) + L(F)
继续从代码中找G和F的父类往里面带
L(G) = G + L(E)
L(F) = F + L(D)+ L(E)
继续找E 和 D
L(E) = E + L(C) + L(A)
L(D) = D + L(B) + L(C)
继续找B和C
L(B) = B + L(A)
L(C) = C + L(A)
最后就剩下⼀个A了. 也就不⽤再找了. 接下来. 把L(A) 往⾥带. 再推回去. 但要记住. 这⾥的
+ 表⽰的是merge. merge的原则是⽤每个元组的头⼀项和后⾯元组的除头⼀项外的其他元
素进⾏比较, 看是否存在. 如果存在. 就从下⼀个元组的头⼀项继续找. 如果找不到. 就拿出来.
作为merge的结果的⼀项. 以此类推. 直到元组之间的元素都相同. 也就不⽤再找了. L(B) =(B,) + (A,) -> (B, A)
L(C) =(C,) + (A,) -> (C, A)
继续带.
L(E) = (E,) + (C, A) + (A) -> E, C, A
L(D) = (D,) + (B, A) + (C, A) -> D, B, A
继续带.
L(G) = (G,) + (E, C, A) -> G, E, C, A
L(F) = (F,) + (D, B, A) + (E, C, A) -> F, D, B, E, C, A
最后:
L(H) = (H,) + (G, E, C, A) + (F, D, B, E, C, A) -> H, G, F, D, B, E, C, A 最终结果 HGFDBECA. 我们也可以用 类名.__mro__ 获取类的MRO信息
print("H.__mro__")
结果:
(<class '__main__.H'>, <class '__main__.G'>, <class '__main__.F'>, <class
'__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class'__main__.C'>,
<class '__main__.A'>, <class 'object'>) 总结:通过一层一层的先拆分,将原来的程序中的类按照它给的继承关系,列出如上诉的
继承关系公式,然后再 用前一个的类(集合)的头和后面一个方法的 尾部(除去第一个类的后面、的类)
对比,如果前面这个头的类名出现在了后面,那么这个头部的类名就去掉,继续这个类集合的下一个,如此循环
直到找完就,最终得到一个 # L(H) = (H,) + (G, E, C, A) + (F, D, B, E, C, A) -> H, G, F, D, B, E, C, A
这样的表达式,这就算是找完了。 解释:C3算法: C3是把我们多个类产⽣的共同继承留到最后去找. 所以. 我们也可以从图上来看到相关
的规律. 这个要⼤家⾃⼰多写多画图就能感觉到了. 但是如果没有所谓的共同继承关系. 那⼏乎就当成
是深度遍历就可以了

三:super() 函数:

super()是查找mro顺序的下一个:单继承中我们可以认为super是对父类中的属性或则方法的引入

class ShengWu:
def dong(self):
print(self)
print("生物") class Animal(ShengWu):
pass
class Cat(Animal):
def dong(self): #子类中出现了和父类重名的内容,表示父类的方法的覆盖
super().dong() #定位到Animal 找Animal的下一个
#super(类,对象).方法() 找到MRO中的类,找这个类的下一个,去执行方法
print("猫会动") #找MRO中的下一个
#Cat-->Animal--> ShengWu
c=Cat()
print(c)
c.dong()

例子

MRO+super面试题
 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 p = Incr(5)
print(p.val)
# Add2 init
c = Add2(2)
print(c.val) MRO算法后的顺序是(计算print(p.val)--> # Incr, pro, add2, mult, haha, Init(可以用print(Incr.__mro__)验证)
print(p.val) 打印结果是: add2 Mult 哈哈 init 5.0 8.0
print(c.val) 打印结果: Add2 init 2 4


python学习之路---day20--面向对象--多继承和super() 函数的更多相关文章

  1. Python学习之路9☞面向对象的程序设计

    一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什么是面向对象的程序设计及为什么要有它 面向过 ...

  2. python学习之路-8 面向对象之进阶

    上篇内容回顾和补充 面向对象三大特性 封装 继承 多态 在python中没有多态的概念 变量的类型允许为多种数据类型称之为多态 # c#/java中的多态 # 伪代码 def func(int arg ...

  3. Python学习之路10☞面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...

  4. Python学习之路——类-面向对象编程

    类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...

  5. Python学习之路基础篇--09Python基础,初识函数

    函数可以分为内置函数 和 自定义函数.这次关注的主要是自定义函数.定义函数之后,就可以在任何需要它的地方调用. 1 返回值的重要性 返回值的3种情况 没有返回值 ---- 返回None 不定 retu ...

  6. Python学习之路-Day1-Python基础

    学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...

  7. Python学习之路【第一篇】-Python简介和基础入门

    1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...

  8. Python学习-第三天-面向对象编程基础

    Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...

  9. python学习之路------你想要的都在这里了

    python学习之路------你想要的都在这里了 (根据自己的学习进度后期不断更新哟!!!) 一.python基础 1.python基础--python基本知识.七大数据类型等 2.python基础 ...

  10. python学习之路-day2-pyth基础2

    一.        模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...

随机推荐

  1. SQLSERVER索引在什么情况下会失效

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的 ...

  2. Springboot21 整合redis、利用redis实现消息队列

    1 前提准备 1.1 创建一个springboot项目 技巧01:本博文基于springboot2.0创建 1.2 安装redis 1.2.1 linux版本 参考博文 1.2.2 windows版本 ...

  3. 基于Ubuntu16搭建Hadoop大数据完全分布式环境

    [目的]:学习大数据 在此记录搭建大数据的过程. [系统环境] 宿主机操作系统:Win7 64位 虚拟机软件:Vmware workstation 12 虚拟机:Ubuntu 16 64位桌面版 [步 ...

  4. 多个if和一个ifelse的区别

    一个程序的要求如下,输入一个学生的数学成绩,如果大于等于60,那么就输出good,如果小于60那么输出not good int a scanf_s("%d",&a) if( ...

  5. Yii2邮箱发送与配置

    1配置邮箱 在 common/config/web.php中写入以下代码配置 Mail代理 return [ 'components' => [ ...//your code, //以下是 ma ...

  6. 安全、结构良好的jQuery结构模板

    安全.结构良好的jQuery结构模板 ;(function($,window,document,undefined){ //我们的代码- })(jQuery,window,document);   参 ...

  7. C#request和response的中文乱码问题

    request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码: response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码:   ...

  8. Java Random、ThreadLocalRandom、UUID类中的方法应用(随机数)

    1.Random:产生一个伪随机数(通过相同的种子,产生的随机数是相同的): Random r=new Random(); System.out.println(r.nextBoolean()); S ...

  9. 编写高质量代码改善C#程序的157个建议——建议1:正确操作字符串

    最近拜读了陆敏技老师的<编写高质量代码改善C#程序的157个建议>,感觉不错,决定把笔记整理一遍. 建议1: 正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型.如果使 ...

  10. 策略(Strategy)模式

    /* * 环境(Context)角色:持有一个Strategy类的引用. * 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现.此角色给出所有的具体策略类所需的接口. * ...