Python中super函数的用法


Posted in Python onNovember 17, 2017

描述

super() 函数用于调用下一个父类(超类)并返回该父类实例的方法。

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。

MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

语法

以下是 super() 方法的语法:

super(type[, object-or-type])

参数

type -- 类。
object-or-type -- 类,一般是 self

返回值

无。

实例

以下展示了使用 super 函数的实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class FooParent(object):
  def __init__(self):
    self.parent = 'I\'m the parent.'
    print ('Parent')
  
  def bar(self,message):
    print ("%s from Parent" % message)
 
class FooChild(FooParent):
  def __init__(self):
    # super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类B的对象 FooChild 转换为类 FooParent 的对象
    super(FooChild,self).__init__()  
    print ('Child')
    
  def bar(self,message):
    super(FooChild, self).bar(message)
    print ('Child bar fuction')
    print (self.parent)
 
if __name__ == '__main__':
  fooChild = FooChild()
  fooChild.bar('HelloWorld')

执行结果:

Parent
Child
HelloWorld from Parent
Child bar fuction
I'm the parent.

python的类分别有新式类和经典类,都支持多继承。在类的继承中,如果你想要重写父类的方法而不是覆盖的父类方法,这个时候我们可以使用super()方法来实现

class C:
  def minus(self,x):
    return x/2

class D(C):
  def minus(self,x):
    super(D, self).minus()
    print 'hello'

上面的代码中C是父类,D是子类,我们在D类重新定义了minus方法,就是在C类的功能基础基础上新添print 'hello'功能。super在这里的作用就是在子类中调用父类的方法,这个也是在单继承常见调用super()的用法。那么问题来了

class A:
  def __init__(self):
    self.n = 10

  def minus(self, m):
    self.n -= m


class B(A):
  def __init__(self):
    self.n = 7

  def minus(self, m):
    super(B,self).minus(m)
    self.n -= 3
B()
B(2)
print b.n

那么上面的代码中b.n的输出是什么呢?为什么结果是2呢,而不是2呢?super(B,self).minus(m)明明是调用了父类的minus方法,可是输出结果就是5,是你要明白现在B的实例,而不是A的实例,那么传递的self.n的数值是7,而不是10.

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

Python 相关文章推荐
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
python脚本实现数据导出excel格式的简单方法(推荐)
Dec 30 Python
python中解析json格式文件的方法示例
May 03 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
python3.x实现base64加密和解密
Mar 28 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
python中元组的用法整理
Jun 15 Python
keras.layer.input()用法说明
Jun 16 Python
Python WebSocket长连接心跳与短连接的示例
Nov 24 Python
10个顶级Python实用库推荐
Mar 04 Python
python双向链表实例详解
May 25 Python
python使用正则表达式替换匹配成功的组
Nov 17 #Python
python定时利用QQ邮件发送天气预报的实例
Nov 17 #Python
详解python eval函数的妙用
Nov 16 #Python
Python算法之图的遍历
Nov 16 #Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 #Python
python字典操作实例详解
Nov 16 #Python
python实现报表自动化详解
Nov 16 #Python
You might like
mysql5写入和读出乱码解决
2006/11/25 PHP
用php过滤危险html代码的函数
2008/07/22 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
删除select中所有option选项jquery代码
2013/08/12 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
如何手写简易的 Vue Router
2020/10/10 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
孝老爱亲模范事迹
2014/01/24 职场文书
家长学校实施方案
2014/03/15 职场文书
会议欢迎词范文
2015/01/27 职场文书
辞职信模板(中英文版)
2015/02/27 职场文书
会议室使用管理制度
2015/08/06 职场文书
校园运动会广播稿
2015/08/19 职场文书
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技