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使用paramiko模块实现ssh远程登陆上传文件并执行
Jan 27 Python
从Python的源码来解析Python下的freeblock
May 11 Python
详解使用python的logging模块在stdout输出的两种方法
May 17 Python
Python定时器实例代码
Nov 01 Python
pandas 获取季度,月度,年度首尾日期的方法
Apr 11 Python
python实现列表中由数值查到索引的方法
Jun 27 Python
python根据txt文本批量创建文件夹
Dec 08 Python
Python中的list与tuple集合区别解析
Oct 12 Python
pycharm双击无响应(打不开问题解决办法)
Jan 10 Python
Python之Sklearn使用入门教程
Feb 19 Python
pytorch 如何使用amp进行混合精度训练
May 24 Python
Python实现的扫码工具居然这么好用!
Jun 07 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实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
php获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
Thinkphp框架中D方法与M方法的区别
2016/12/23 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
RC4文件加密的python实现方法
2015/06/30 Python
使用Python实现简单的服务器功能
2017/08/25 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
利用Python检测URL状态
2019/07/31 Python
centos7之Python3.74安装教程
2019/08/15 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
linux面试题参考答案(11)
2012/05/01 面试题
2015年煤矿安全工作总结
2015/05/23 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
MySQL 查询速度慢的原因
2021/05/25 MySQL
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
MySQL窗口函数的具体使用
2021/11/17 MySQL