深入理解Python 关于supper 的 用法和原理


Posted in Python onFebruary 28, 2018

一、前言

Python 面向对象中有继承这个概念,初学时感觉很牛逼,里面也有个super类,经常见到,最近做一些题才算是理解了。特地记录分享给后来研究的小伙伴,毕竟现在小学生都开始学了(滑稽脸)

二、代码

直接上干货,能把下面一个问题全答对,后面就不用看了。

class A():
  def go(self):
    print ("go A go!")
  def stop(self):
    print ("stop A stop!")
  def pause(self):
    raise Exception("Not Implemented")
class B(A):
  def go(self):
    super(B, self).go()
    print ("go B go!")
class C(A):
  def go(self):
    super(C, self).go()
    print ("go C go!")
  def stop(self):
    super(C, self).stop()
    print ("stop C stop!")
class D(B,C):
  def go(self):
    super(D, self).go()
    print ("go D go!")
  def stop(self):
    super(D, self).stop()
    print ("stop D stop!")
  def pause(self):
    print ("wait D wait!")
class E(B,C):
  pass
a = A()
b = B()
c = C()
d = D()
e = E()
# 说明下列代码的输出结果
a.go()
print('--------')
b.go()
print('--------')
c.go()
print('--------')
d.go()
print('--------')
e.go()
print('--------')
a.stop()
print('--------')
b.stop()
print('--------')
c.stop()
print('--------')
d.stop()
print('--------')
e.stop()
print(D.mro())
a.pause()
b.pause()
c.pause()
d.pause()
e.pause()

当然,直接运行就有答案了,还是要仔细想一下,反正看到我第一次跑出的结果的时候,我都不敢相信自己的眼睛。

step1:

几个概念:

继承的功能:父类的代码重用

多态的功能:同一方法对不同类型的对象会有相应的结果

开闭原则:对扩展开放,对修改封闭

super类功能:新式类实现广度优先的不重复的调用父类,解决了钻石继承(多继承)的难题

step2:

super实现原理:通过c3算法,生成mro(method resolution order)列表,根据列表中元素顺序查询调用

新式类调用顺序为广度优先,旧式类为深度优先

step3:

个人理解:

1.调用了父类的方法,出入的是子类的实例对象

2.新式类子类(A,B),A就在B之前

3.super类似于嵌套的一种设计,当代码执行到super实例化后,先去找同级父类,若没有其余父类,再执行自身父类,再往下走,

简洁点的三个原则就是:

子类在父类前,所有类不重复调用,从左到右

理解了以上的说法,题目就没问题了。

也不用跑了,答案如下:

a.go()# go A go!
b.go()# go A go!# go B go!
c.go()# go A go!# go C go!
d.go()# go A go!# go C go!# go B go!# go D go!
e.go()# go A go!# go C go!# go B go!
a.stop()# stop A stop!
b.stop()# stop A stop!
c.stop()# stop A stop!# stop C stop!
d.stop()# stop A stop!# stop C stop!# stop D stop!
e.stop()# stop A stop!
a.pause()# ... Exception: Not Implemented
b.pause()# ... Exception: Not Implemented
c.pause()# ... Exception: Not Implemented
d.pause()# wait D wait!
e.pause()# ...Exception: Not Implemented

看了答案,其实还有一点,父类抛异常的情况,如果子类有不抛异常的方法,异常就不抛出了,这个设计也会很有用。

这里就中间一个A,C,B,D的和网上常见的不太一样,促使我仔细研究了一下,其实就是个人理解第三条。

补充:

Python2 和Python3在这个问题上的差别

Python2 没有默认继承object

Python3 默认全部继承object类,都是新式类

Python2super调用 super(开始类名,self).函数名()

Python3  super().函数名()

关于调用父类函数传入子类实例的栗子举一个:

class A:
  def __init__(self):
    self.n = 2
  def add(self, m):
    print('self is {0} @A.add'.format(self))
    self.n += m
class B(A):
  def __init__(self):
    self.n = 3
  def add(self, m):
    print('self is {0} @B.add'.format(self))
    super().add(m)
    print('newb')
    self.n += 3
class C(A):
  def __init__(self):
    self.n = 4
  def add(self, m):
    print('self is {0} @C.add'.format(self))
    super().add(m)
    print('newc')
    self.n += 4
class D(B, C):
  def __init__(self):
    self.n = 5
  def add(self, m):
    print('self is {0} @D.add'.format(self))
    super().add(m)
    self.n += 5
d = D()
d.add(2)
print(d.n)

总结

以上所述是小编给大家介绍的Python 关于supper 的 用法和原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python模拟登陆Tom邮箱示例分享
Jan 13 Python
python调用windows api锁定计算机示例
Apr 17 Python
Python的类实例属性访问规则探讨
Jan 30 Python
python操作列表的函数使用代码详解
Dec 28 Python
Django基础知识与基本应用入门教程
Jul 20 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
python ChainMap的使用和说明详解
Jun 11 Python
python将字母转化为数字实例方法
Oct 04 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
tensorflow与numpy的版本兼容性问题的解决
Jan 08 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
TensorFlow实现RNN循环神经网络
Feb 28 #Python
python使用TensorFlow进行图像处理的方法
Feb 28 #Python
使用Python搭建虚拟环境的配置方法
Feb 28 #Python
Python OpenCV获取视频的方法
Feb 28 #Python
python实现多线程行情抓取工具的方法
Feb 28 #Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 #Python
python定向爬取淘宝商品价格
Feb 27 #Python
You might like
Zend的AutoLoad机制介绍
2012/09/27 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
[07:55]2014DOTA2 TI正赛第三日 VG上演推进荣耀DKEG告别
2014/07/21 DOTA
Python入门篇之面向对象
2014/10/20 Python
Python获取央视节目单的实现代码
2015/07/25 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
python 实用工具状态机transitions
2020/11/21 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
企业治理工作自我评价
2013/09/26 职场文书
市场营销专业毕业生自荐信
2013/11/02 职场文书
安全检查与奖惩制度
2014/01/23 职场文书
保密承诺书范文
2014/03/27 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
优秀护士先进事迹
2014/05/08 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2014年班级工作总结
2014/11/14 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python