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抓取模板之家的CSS模板
Mar 16 Python
python黑魔法之编码转换
Jan 25 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
对dataframe进行列相加,行相加的实例
Jun 08 Python
10个Python小技巧你值得拥有
Sep 29 Python
Python并行分布式框架Celery详解
Oct 15 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
如何用python批量调整视频声音
Dec 22 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 Python
pandas 操作 Excel操作总结
Mar 31 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
JavaScript 乱码问题
2009/08/06 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
js实现滚动条自动滚动
2020/12/13 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
Python File(文件) 方法整理
2019/02/18 Python
Python安装whl文件过程图解
2020/02/18 Python
django实现后台显示媒体文件
2020/04/07 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
python和JavaScript哪个容易上手
2020/06/23 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
英国门销售网站:Green Tree Doors
2020/01/07 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
几个常见的软件测试问题
2016/09/07 面试题
监察建议书格式
2014/05/19 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis
Java使用JMeter进行高并发测试
2021/11/23 Java/Android
linux目录管理方法介绍
2022/06/01 Servers