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中的Numpy入门教程
Apr 26 Python
python之import机制详解
Jul 03 Python
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 Python
跟老齐学Python之编写类之二方法
Oct 11 Python
Python学习笔记之os模块使用总结
Nov 03 Python
python3制作捧腹网段子页爬虫
Feb 12 Python
详解Python pygame安装过程笔记
Jun 05 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
Aug 03 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
django 模型中的计算字段实例
May 19 Python
PyQt5实现画布小程序
May 30 Python
python识别验证码的思路及解决方案
Sep 13 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
php检测图片木马多进制编程实践
2013/04/11 PHP
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
用Python进行基础的函数式编程的教程
2015/03/31 Python
Python字符串逐字符或逐词反转方法
2015/05/21 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
英国曼彻斯特宠物用品品牌:Bunty Pet Products
2019/07/27 全球购物
网络工程师的自我评价
2013/10/02 职场文书
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
英文版银行求职信
2013/10/09 职场文书
大学生自我鉴定范文
2013/12/28 职场文书
教师一岗双责责任书
2014/04/16 职场文书
五年级学生评语大全
2014/12/26 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
俄罗斯十大城市人口排名,第三首都仅排第六,第二是北方首都
2022/03/20 杂记
MySql分区类型及创建分区的方法
2022/04/13 MySQL