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爬取csdn博客访问量
Feb 14 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
python实现隐马尔科夫模型HMM
Mar 25 Python
python-str,list,set间的转换实例
Jun 27 Python
python里dict变成list实例方法
Jun 26 Python
Python生成词云的实现代码
Jan 14 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
python 制作网站筛选工具(附源码)
Jan 21 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 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为字符串前后添加指定数量字符的方法
2015/05/04 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
jquery实现checkbox全选全不选的简单实例
2013/12/31 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
jQuery实现页面评论栏中访客信息自动填写功能的方法
2016/05/23 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
使用Bootstrap做一个朝代历史表
2019/12/10 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
浅谈五大Python Web框架
2017/03/20 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
12个Python程序员面试必备问题与答案(小结)
2019/06/24 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
工程采购员岗位职责
2014/03/09 职场文书
2014年消防工作总结
2014/11/21 职场文书
青岛导游词
2015/02/12 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
Pandas数据结构之Series的使用
2022/03/31 Python