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之折腾一下目录
Oct 24 Python
Python CSV模块使用实例
Apr 09 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 Python
对python while循环和双重循环的实例详解
Aug 23 Python
面向对象学习之pygame坦克大战
Sep 11 Python
python判断无向图环是否存在的示例
Nov 22 Python
pytorch中的卷积和池化计算方式详解
Jan 03 Python
pytorch 常用线性函数详解
Jan 15 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
python如何用matplotlib创建三维图表
Jan 26 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
Aug 14 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
PHP 第三节 变量介绍
2012/04/28 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
php验证码实现代码(3种)
2015/09/07 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python实现在windows下操作word的方法
2015/04/28 Python
Python实现从URL地址提取文件名的方法
2015/05/15 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
大课间体育活动方案
2014/03/12 职场文书
热情服务标语
2014/10/07 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
浅谈Web Storage API的使用
2021/06/23 Javascript
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android
python全面解析接口返回数据
2022/02/12 Python