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 Web开发框架Django
Jun 30 Python
python根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
Python的re模块正则表达式操作
May 25 Python
Python数据类型之Number数字操作实例详解
May 08 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
如何使用python操作vmware
Jul 27 Python
Python中生成一个指定长度的随机字符串实现示例
Nov 06 Python
python从内存地址上加载python对象过程详解
Jan 08 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
使用Python发现隐藏的wifi
Mar 04 Python
Python数据清洗工具之Numpy的基本操作
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生成数组的使用示例 php全组合算法
2014/01/16 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
jQuery Selector选择器小结
2010/05/06 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
JavaScript基础重点(必看)
2016/07/09 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
Python 的内置字符串方法小结
2016/03/15 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
Python第三方库h5py_读取mat文件并显示值的方法
2019/02/08 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
对Python3之方法的覆盖与super函数详解
2019/06/26 Python
python安装scipy的步骤解析
2019/09/28 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
Python爬虫教程知识点总结
2020/10/19 Python
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
一套Delphi的笔试题一
2016/02/14 面试题
音乐系毕业生自荐信
2013/10/27 职场文书
历史学专业推荐信
2013/11/06 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
2014年质检工作总结
2014/11/26 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
小学教师岗位职责
2015/04/02 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
导游词之南京中山陵
2019/11/27 职场文书
Python安装使用Scrapy框架
2022/04/12 Python