深入理解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的Tornado框架中实现简单的在线代理的教程
May 02 Python
python组合无重复三位数的实例
Nov 13 Python
深入浅析python 协程与go协程的区别
May 09 Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 Python
Python实现i人事自动打卡的示例代码
Jan 09 Python
解决Django no such table: django_session的问题
Apr 07 Python
pandas dataframe 中的explode函数用法详解
May 18 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
用Python写一个简易版弹球游戏
Apr 13 Python
如何用python反转图片,视频
Apr 24 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
Pygame Draw绘图函数的具体使用
Nov 17 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
很温暖很温暖的Lester Young
2021/03/03 冲泡冲煮
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
php的4种常见运行方式
2015/03/20 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP 实现链式操作
2021/03/09 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
js 判断checkbox是否选中的实现代码
2010/11/23 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
js实现简单的倒计时
2021/01/28 Javascript
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
基于python时间处理方法(详解)
2017/08/14 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
关于python3中setup.py小概念解析
2019/08/22 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
python写一个随机点名软件的实例
2019/11/28 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
Timberland澳大利亚官网:全球领先的户外品牌
2019/12/10 全球购物
学生干部的自我评价分享
2014/01/18 职场文书
年会活动策划方案
2014/01/23 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
安全先进个人材料
2014/12/29 职场文书