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+mysql实现简单的web程序
Sep 11 Python
python发送邮件功能实现代码
Jul 15 Python
Python编程实战之Oracle数据库操作示例
Jun 21 Python
django主动抛出403异常的方法详解
Jan 04 Python
python的sorted用法详解
Jun 25 Python
利用rest framework搭建Django API过程解析
Aug 31 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
Python json读写方式和字典相互转化
Apr 18 Python
Python使用re模块验证危险字符
May 21 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 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
DIY实用性框形天线
2021/03/02 无线电
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
php中通过curl模拟登陆discuz论坛的实现代码
2012/02/16 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
2013/06/05 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
jQuery简介_动力节点Java学院整理
2017/07/04 jQuery
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
python with statement 进行文件操作指南
2014/08/22 Python
python实现根据ip地址反向查找主机名称的方法
2015/04/29 Python
Python调用C++程序的方法详解
2017/01/24 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
HTML5的postMessage的使用手册
2018/12/19 HTML / CSS
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
小学生自我鉴定
2013/10/12 职场文书
大学生求职自荐信
2013/12/12 职场文书
调解员先进事迹材料
2014/02/07 职场文书
中学学校门卫岗位职责
2014/08/15 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
导游词之西递宏村
2019/12/10 职场文书