python之super的使用小结


Posted in Python onAugust 13, 2018

为什么需要super

在python没有引入super之前, 如果需要在子类中引用父类的方法, 一般写法如下:

class Father:
 def whoami(self):
  print("I am father")


class Child:
 def whoami(self):
  print("I am child")
  Father.whoami(self)

这样看好像没什么问题, 就算没有super也能正常调用父类的方法, 但是如果有一天Father类需要修改类名为Father1, 那么子类Child中也必须跟着修改.

想象下如果一个类有很多个子类, 这样一来我们就需要修改每个子类中引用父类的语句

怎么使用super

Help on class super in module builtins:

class super(object)
 | super() -> same as super(__class__, <first argument>)
 | super(type) -> unbound super object
 | super(type, obj) -> bound super object; requires isinstance(obj, type)
 | super(type, type2) -> bound super object; requires issubclass(type2, type)
 | Typical use to call a cooperative superclass method:
 | class C(B):
 |   def meth(self, arg):
 |     super().meth(arg)
 | This works for class methods too:
 | class C(B):
 |   @classmethod
 |   def cmeth(cls, arg):
 |     super().cmeth(arg)

我们来看看super的帮助文档, 首先super是一个类, 它的调用方法有如下几种:

1.super()
2.super(type)
3.super(type, obj)
4.super(type, type2)

我们推荐用第一种方法来使用super, 因为它并不需要显式传递任何参数.但是要注意一点, super只能在新式类中使用.

class A:
 def __init__(self):
  print("this is A")

class B(A):
 def __init__(self):
  super().__init__()
  print("this is B")

b = B()

"""
this is A
this is B
"""

看起来super就像直接调用了B的父类A的__init__, 其实并不是这样的, 我们看看super在多继承下的使用

class A:
 def __init__(self):
  print("this is A")
  print("leave A")

class B(A):
 def __init__(self):
  print("this is B")
  super().__init__()
  print("leave B")

class C(A):
 def __init__(self):
  print("this is C")
  super().__init__()
  print("leave C")
 

class D(B, C):
 def __init__(self):
  print("this is D")
  super().__init__()
  print("leave D")  
  
d = D()

"""
this is D
this is B
this is C
this is A
leave A
leave C
leave B
leave D
"""

print(D.__mro__)
"""
(<class '__main__.D'>, 
<class '__main__.B'>, 
<class '__main__.C'>, 
<class '__main__.A'>, 
<class 'object'>)
"""

这里可以看到, 如果super只是简单调用父类的方法的话, 那么调用了B的__init__ 方法之后, 应该调用A的__init__ 才对, 但是调用的却是C的__init__ 方法

这是因为super调用的是当前类在MRO列表中的后一个类, 而并不是简单地调用当前类的父类

python并没有强制性限制我们使用super调用父类, 我们还是可以使用原始的方法来调用父类中的方法, 但是需要注意的是调用父类的方法要统一, 即全用super或全不用super, 而用super 的话, 调用的方式也最好是统一的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python新手入门最容易犯的错误总结
Apr 24 Python
pycharm安装图文教程
May 02 Python
Python实现的桶排序算法示例
Nov 29 Python
python实现简易版计算器
Jun 22 Python
python实现图片批量压缩程序
Jul 23 Python
python3对接mysql数据库实例详解
Apr 30 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
python3.6使用SMTP协议发送邮件
May 20 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
详解python百行有效代码实现汉诺塔小游戏(简约版)
Oct 30 Python
Selenium控制浏览器常见操作示例
Aug 13 #Python
详解python3中的真值测试
Aug 13 #Python
利用Python将每日一句定时推送至微信的实现方法
Aug 13 #Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 #Python
python删除字符串中指定字符的方法
Aug 13 #Python
Django contenttypes 框架详解(小结)
Aug 13 #Python
Python中的Numpy矩阵操作
Aug 12 #Python
You might like
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
php中关于换行的实例写法
2019/09/26 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
javascript基础知识讲解
2017/01/11 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
Python中的Numpy入门教程
2014/04/26 Python
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
python绘制中国大陆人口热力图
2018/11/07 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
自我鉴定书面格式
2014/01/13 职场文书
十八届三中全会学习方案
2014/02/16 职场文书
学校督导评估方案
2014/06/10 职场文书
承租经营合作者协议书
2014/10/01 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
经理岗位职责范本
2015/04/15 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle