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中操作MySQL入门实例
Feb 08 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
python 文件操作api(文件操作函数)
Aug 28 Python
python中pylint使用方法(pylint代码检查)
Apr 06 Python
Python中pillow知识点学习
Apr 30 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
简单了解python元组tuple相关原理
Dec 02 Python
python模拟实现斗地主发牌
Jan 07 Python
python 利用panda 实现列联表(交叉表)
Feb 06 Python
python实现简单的聊天小程序
Jul 07 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中使用Oracle数据库(5)
2006/10/09 PHP
php完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
学习JavaScript的最佳方法分享
2011/10/21 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
Vue源码分析之Vue实例初始化详解
2019/08/25 Javascript
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
Python解析xml中dom元素的方法
2015/03/12 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
水污染治理专业毕业生推荐信
2013/11/14 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python
Win11软件图标固定到任务栏
2022/04/19 数码科技