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 cookielib 登录人人网的实现代码
Dec 19 Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 Python
Python中的命令行参数解析工具之docopt详解
Mar 27 Python
Python基于plotly模块实现的画图操作示例
Jan 23 Python
python3.x提取中文的正则表达式示例代码
Jul 23 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
Python爬虫:将headers请求头字符串转为字典的方法
Aug 21 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
基于python实现破解滑动验证码过程解析
May 28 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
python3爬虫中多线程的优势总结
Nov 24 Python
Python中tkinter的用户登录管理的实现
Apr 22 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调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
2017/05/03 Javascript
webpack3之loader全解析
2017/10/26 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
javascript运行机制之执行顺序理解
2020/08/03 Javascript
在Vue里如何把网页的数据导出到Excel的方法
2020/09/30 Javascript
JavaScript中遍历的十种方法总结
2020/12/15 Javascript
Python找出list中最常出现元素的方法
2016/06/14 Python
用Python设计一个经典小游戏
2017/05/15 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
亮化工程实施方案
2014/03/17 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
关于教师节的广播稿
2015/08/19 职场文书
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS