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实现带验证码网站的自动登陆实现代码
Jan 12 Python
Python检测一个对象是否为字符串类的方法
May 21 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
用pickle存储Python的原生对象方法
Apr 28 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
Python根据成绩分析系统浅析
Feb 11 Python
python ddt数据驱动最简实例代码
Feb 22 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
python实现点击按钮修改数据的方法
Jul 17 Python
python实现差分隐私Laplace机制详解
Nov 25 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
python有几个版本
Jun 17 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通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
php英文单词统计器
2016/06/23 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
js转义字符介绍
2013/11/05 Javascript
JavaScript设计模式之代理模式介绍
2014/12/28 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
如何选择适合你的JavaScript框架
2017/11/20 Javascript
浅谈React深度编程之受控组件与非受控组件
2017/12/26 Javascript
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
Python中max函数用于二维列表的实例
2018/04/03 Python
python3+PyQt5实现文档打印功能
2018/04/24 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
2018/04/28 Python
python Kmeans算法原理深入解析
2019/08/23 Python
keras 权重保存和权重载入方式
2020/05/21 Python
python入门教程之基本算术运算符
2020/11/13 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
大学生找工作推荐信范文
2013/11/28 职场文书
初一体育教学反思
2014/01/29 职场文书
文明宿舍获奖感言
2014/02/07 职场文书
《雨霖铃》教学反思
2014/02/22 职场文书
药品业务员岗位职责
2014/04/17 职场文书
党员三严三实心得体会
2014/10/13 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
Python中如何处理常见报错
2022/01/18 Python
分享MySQL常用 内核 Debug 几种常见方法
2022/03/17 MySQL