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中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
Django项目中用JS实现加载子页面并传值的方法
May 28 Python
Python格式化日期时间操作示例
Jun 28 Python
python Tkinter版学生管理系统
Feb 20 Python
python3 pygame实现接小球游戏
May 14 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
python的等深分箱实例
Nov 22 Python
Python之——生成动态路由轨迹图的实例
Nov 22 Python
python 异步async库的使用说明
May 04 Python
python神经网络 使用Keras构建RNN训练
May 04 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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
微信公众号OAuth2.0网页授权问题浅析
2017/01/21 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
javascript中的对象创建 实例附注释
2011/02/08 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
vue中的模态对话框组件实现过程
2018/05/01 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python中map、any、all函数用法分析
2015/04/21 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
python 堆和优先队列的使用详解
2019/03/05 Python
python函数的作用域及关键字详解
2019/08/20 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
养殖人员的创业计划书范文
2013/12/26 职场文书
关于环保的活动方案
2014/08/25 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
体育委员竞选稿
2015/11/21 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
python获取对象信息的实例详解
2021/07/07 Python
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS