Python中super关键字用法实例分析


Posted in Python onMay 28, 2015

本文实例讲述了Python中super关键字用法。分享给大家供大家参考。具体分析如下:

在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1:

代码段1:

class A:
def __init__(self):
  print "enter A"
  print "leave A"
class B(A):
def __init__(self):
  print "enter B"
  A.__init__(self)
  print "leave B"
>>> b = B()

enter B
enter A
leave A
leave B

即,使用非绑定的类方法(用类名来引用的方法),并在参数列表中,引入待绑定的对象(self),从而达到调用父类的目的。

这样做的缺点是,当一个子类的父类发生变化时(如类B的父类由A变为C时),必须遍历整个类定义,把所有的通过非绑定的方法的类名全部替换过来,例如代码段2,

代码段2:

class B(C):  # A --> C
def __init__(self):
  print "enter B"
  C.__init__(self) # A --> C
  print "leave B"

如果代码简单,这样的改动或许还可以接受。但如果代码量庞大,这样的修改可能是灾难性的。很容易导致修改错误的出现。

因此,自Python 2.2开始,Python添加了一个关键字super,来解决这个问题。下面是Python 2.3的官方文档说明:

super(type[, object-or-type])
Return the superclass of type. If the second argument is omitted the super object
returned is unbound. If the second argument is an object, isinstance(obj, type) 
must be true. If the second argument is a type, issubclass(type2, type) must be 
true. super() only works for new-style classes.
A typical use for calling a cooperative superclass method is:
  class C(B):
    def meth(self, arg):
      super(C, self).meth(arg)
New in version 2.2.

从说明来看,可以把类B改写如代码段3:

代码段3:

class A(object):  # A must be new-style class
def __init__(self):
  print "enter A"
  print "leave A"
class B(C):   # A --> C
def __init__(self):
  print "enter B"
  super(B, self).__init__()
  print "leave B"

尝试执行上面同样的代码,结果一致,但修改的代码只有一处,把代码的维护量降到最低,是一个不错的用法。因此在我们的开发过程中,super关键字被大量使用,而且一直表现良好。

1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,产生了一个super对象;

2. super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;

3. super(B, self).func的调用并不是用于调用当前类的父类的func函数;

4. Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数只调用一次(如果每个类都使用super);

5. 混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一个父类函数被调用多次。

从super关键字的help我们也能看出来。

Help on class super in module __builtin__:
class super(object)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)
 |  Typical use to call a cooperative superclass method:
 |  class C(B):
 |      def meth(self, arg):
 |           super(C, self).meth(arg)
 | 
 |  Methods defined here:
.......

从上面也能看出来,super是一个类,而且是__builtin__模块中的。

从上面的描述来看,super主要是用于调用父类的方法。

那么,在2.2之前的方法也能调用。为啥非得用super呢?

这是因为super能够阻止对父类方法的多次调用。

super,改变了父类搜索顺序, 返回的是一个特殊的父类对象
看例子:

class A: pass class B(A): pass class C(A):pass class D(B, C): pass

这是4个类的基本关系。

假如不使用super,让D的对象调用他们共有的一个方法,会2次调用A中这个方法。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
从零学python系列之教你如何根据图片生成字符画
May 23 Python
python抓取文件夹的所有文件
Feb 27 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
python批量获取html内body内容的实例
Jan 02 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
学习和使用python的13个理由
Jul 30 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 Python
Python性能分析工具Profile使用实例
Nov 19 Python
Python实现桌面翻译工具【新手必学】
Feb 12 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 Python
Python使用Supervisor来管理进程的方法
May 28 #Python
Python运算符重载用法实例
May 28 #Python
Python smallseg分词用法实例分析
May 28 #Python
Python基于smtplib实现异步发送邮件服务
May 28 #Python
Python使用Scrapy爬取妹子图
May 28 #Python
Python实现统计单词出现的个数
May 28 #Python
Python下载懒人图库JavaScript特效
May 28 #Python
You might like
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
javascript 面向对象思想 附源码
2009/07/07 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
12个步骤教你理解Python装饰器
2019/07/01 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
Python模块相关知识点小结
2020/03/09 Python
python中关于数据类型的学习笔记
2020/07/19 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
Baracuta官方网站:Harrington夹克,G9,G4,G10等
2018/03/06 全球购物
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
店长助理岗位职责
2013/12/13 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
科技工作者先进事迹
2014/08/16 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
六查六看六改心得体会
2014/10/14 职场文书