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检测一个对象是否为字符串类的方法
May 21 Python
Python使用minidom读写xml的方法
Jun 03 Python
一份python入门应该看的学习资料
Apr 11 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
python实现n个数中选出m个数的方法
Nov 13 Python
python频繁写入文件时提速的方法
Jun 26 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
Python 没有main函数的原因
Jul 10 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 Python
python中的random模块和相关函数详解
Apr 22 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
十大“创意”战术!
2020/03/04 星际争霸
PHPMailer使用教程(PHPMailer发送邮件实例分析)
2012/12/06 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
Sea.JS知识总结
2016/05/05 Javascript
js实现常用排序算法
2016/08/09 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
如何理解Vue的.sync修饰符的使用
2017/08/17 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
深入理解移动前端开发之viewport
2018/10/19 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
python将回车作为输入内容的实例
2018/06/23 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
python性能测试工具locust的使用
2020/12/28 Python
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
加多宝凉茶广告词
2014/03/18 职场文书
信息管理专业自荐书
2014/06/05 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
七一活动主持词
2015/06/29 职场文书
致接力运动员加油稿
2015/07/21 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers