python学习之路---day20--面向对象--多继承和super() 函数
一: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() 函数的更多相关文章
- Python学习之路9☞面向对象的程序设计
一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什么是面向对象的程序设计及为什么要有它 面向过 ...
- python学习之路-8 面向对象之进阶
上篇内容回顾和补充 面向对象三大特性 封装 继承 多态 在python中没有多态的概念 变量的类型允许为多种数据类型称之为多态 # c#/java中的多态 # 伪代码 def func(int arg ...
- Python学习之路10☞面向对象进阶
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...
- Python学习之路——类-面向对象编程
类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...
- Python学习之路基础篇--09Python基础,初识函数
函数可以分为内置函数 和 自定义函数.这次关注的主要是自定义函数.定义函数之后,就可以在任何需要它的地方调用. 1 返回值的重要性 返回值的3种情况 没有返回值 ---- 返回None 不定 retu ...
- Python学习之路-Day1-Python基础
学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...
- Python学习之路【第一篇】-Python简介和基础入门
1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...
- Python学习-第三天-面向对象编程基础
Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...
- python学习之路------你想要的都在这里了
python学习之路------你想要的都在这里了 (根据自己的学习进度后期不断更新哟!!!) 一.python基础 1.python基础--python基本知识.七大数据类型等 2.python基础 ...
- python学习之路-day2-pyth基础2
一. 模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...
随机推荐
- java基础之JDBC一:概述及步骤详解
1. JDBC的简介 概述: 就是Java用来操作不同数据库(DBMS)的类库(技术), 本质就是一些类和接口. /* 类: DriverManager 接口: Driver, Connection, ...
- 并发之AtomicIntegerArray
5 并发之AtomicIntegerArray 该类是Java对Integer数组支持的原子性操作:在认识这个类之前我们先来看一个方法,这个方法是Integer类中的: public sta ...
- CSS 伪类与伪元素
CSS的元素选择器除了根据id(#).class(.).属性([ ])选取元素以外,还有很重要的一类,就是根据元素的特殊状态来选取元素.它们就是伪类和伪元素.跟id选择器.类选择器.属性选择器以及派生 ...
- 在TFS中获取项目,获取最新和上传(迁入)
一.在TFS中获取项目: (1)team (2)connect to team.... (3)选择服务地址,然后close (4)然后映射本地文件夹下载项目 (5)mapped添加映射,在map下就可 ...
- selenium2 定位 窗体切换等等 (二)
定位用的html素材有两个 demo.html <html> <head> <title>UI Automation Testing</title> & ...
- 一个jquery在不同浏览器下的兼容性问题。
<div id ='pdiv' style='visibility:hidden;'> <div id='cdiv'>子元素</div> </div> ...
- linux下方便的录屏命令
linux下方便的录屏命令 ffmpeg -f x11grab -s 1024*768 -r 20 -i :0.0 -sameq ~/recode.mpg -r后是刷新屏率, 推出直接Ctrl ...
- Django框架 之 admin管理工具(组件使用)
Django框架 之 admin管理工具(组件使用) 浏览目录 激活管理工具 使用管理工具 admin的定制 admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理 ...
- Python基础 之 变量、用户交互、if条件语句、while循环语句、编码、逻辑运算
一.Python介绍 Python 崇尚优美.清晰.简单 Python是一门动态解释型的强制性定义的语言. 二.编译型和解释型的区别 编译型:一次性将所有与程序编译成二进制文件. 缺点:开发效率低,不 ...
- 关于instanceof测试遇到的问题
今天上上课 用 instanceof关键字来判断某个对象是否属于某种数据类型.报错 代码如下 package cn.lijun.demo3; import cn.lijun.demo.Person; ...