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在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
python使用pil生成缩略图的方法
Mar 26 Python
Python计算一个文件里字数的方法
Jun 15 Python
全面了解python字符串和字典
Jul 07 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
python实现websocket的客户端压力测试
Jun 25 Python
python yield关键词案例测试
Oct 15 Python
python判断无向图环是否存在的示例
Nov 22 Python
python绘制动态曲线教程
Feb 24 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 Python
浅析python字符串前加r、f、u、l 的区别
Jan 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
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
表单复选框向PHP传输数据的代码
2007/11/13 PHP
php操作csv文件代码实例汇总
2014/09/22 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
JavaScript 提升运行速度之循环篇 译文
2009/08/15 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
javascript event 事件解析
2011/01/31 Javascript
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
python 实现多线程下载视频的代码
2019/11/15 Python
Python笔记之观察者模式
2019/11/20 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
测绘工程系学生的自我评价
2013/11/30 职场文书
领导欢迎词范文
2015/01/26 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
被告答辩状范文
2015/05/22 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书