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下的twisted框架入门指引
Apr 15 Python
Python2.x与Python3.x的区别
Jan 14 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
Jan 09 Python
python的dataframe和matrix的互换方法
Apr 11 Python
详解Python的三种可变参数
May 08 Python
Python OpenCV中的resize()函数的使用
Jun 20 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
Sep 29 Python
你可能不知道的Python 技巧小结
Jan 29 Python
python plt可视化——打印特殊符号和制作图例代码
Apr 17 Python
python中Django文件上传方法详解
Aug 05 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 Python
python 模块导入问题汇总
Feb 01 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入门
2006/10/09 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
可以支持多中格式的JS键盘
2007/05/02 Javascript
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
简单的JS多重继承示例
2008/03/13 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
说说AngularJS中的$parse和$eval的用法
2017/09/14 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
Python中常用的内置方法
2019/01/28 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
python urllib爬虫模块使用解析
2019/09/05 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
python实现udp聊天窗口
2020/03/31 Python
python有几个版本
2020/06/17 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
Python的信号库Blinker用法详解
2020/12/31 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
优秀幼教自荐信
2014/02/03 职场文书
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书