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实现计算资源图标crc值的方法
Oct 05 Python
python如何读写csv数据
Mar 21 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
Python3安装Pillow与PIL的方法
Apr 03 Python
Python实现微信翻译机器人的方法
Aug 13 Python
Python队列、进程间通信、线程案例
Oct 25 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
python3中编码获取网页的实例方法
Nov 16 Python
python中绕过反爬虫的方法总结
Nov 25 Python
Python实现自动整理文件的脚本
Dec 17 Python
python实现按日期归档文件
Jan 30 Python
Pygame Rect区域位置的使用(图文)
Nov 17 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
Yii全局函数用法示例
2017/01/22 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
JavaScript更改class和id的方法
2008/10/10 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
用pandas按列合并两个文件的实例
2018/04/12 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
Python程序控制语句用法实例分析
2020/01/14 Python
numba提升python运行速度的实例方法
2021/01/25 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
土木工程专业个人求职信
2013/12/30 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
乒乓球比赛通知
2015/04/27 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
行政处罚告知书
2015/07/01 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python