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验证码识别处理实例
Dec 28 Python
对python中的pop函数和append函数详解
May 04 Python
python执行CMD指令,并获取返回的方法
Dec 19 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
Python实现RabbitMQ6种消息模型的示例代码
Mar 30 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
python实现canny边缘检测
Sep 14 Python
Django migrate报错的解决方案
May 20 Python
Python实现生活常识解答机器人
Jun 28 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 编程请选择正确的文本编辑软件
2006/12/21 PHP
PHP教程 基本语法
2009/10/23 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
简单谈谈jQuery(function(){})与(function(){})(jQuery)
2014/12/19 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
python实现基本进制转换的方法
2015/07/11 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
Hotter Shoes英国官网:英伦风格,舒适的鞋子
2017/12/28 全球购物
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
致百米运动员广播稿
2014/01/29 职场文书
共产党员承诺书
2014/03/25 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
设计专业自荐信
2014/06/19 职场文书
办理信用卡工作证明
2014/09/30 职场文书
学校师德师风整改方案
2014/10/28 职场文书
负责培养人意见
2015/06/05 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android