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 相关文章推荐
Linux下编译安装MySQL-Python教程
Feb 02 Python
Cpy和Python的效率对比
Mar 20 Python
详解Python中类的定义与使用
Apr 11 Python
利用Python破解斗地主残局详解
Jun 30 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
Python实现某论坛自动签到功能
Aug 20 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
如何在mac环境中用python处理protobuf
Dec 25 Python
python有序查找算法 二分法实例解析
Feb 18 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
Python: glob匹配文件的操作
Dec 11 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
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
vue2.0 + ele的循环表单及验证字段方法
2018/09/18 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
python框架flask表单实现详解
2019/11/04 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
python如何建立全零数组
2020/07/19 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
HTML5实现WebSocket协议原理浅析
2014/07/07 HTML / CSS
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
酒店经理职责
2014/01/30 职场文书
食品安全责任书
2014/04/15 职场文书
省文明单位申报材料
2014/05/08 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
师德师风整改措施
2014/10/24 职场文书
2015年生活老师工作总结
2015/05/27 职场文书