之前看python文档的时候发现许多单继承类也用了super()来申明父类,那么这样做有何意义?

从python官网文档对于super的介绍来看,其作用为返回一个代理对象作为代表调用父类或亲类方法。(Return a proxy object that delegates method calls to a parent or sibling class of type. This is useful for accessing inherited methods that have been overridden in a class. )

super()的主要用法有两种:

单类继承中,其意义就是不需要父类的名称来调用父类的函数,因此当子类改为继承其他父类的时候,不需要对子类内部的父类调用函数做任何修改就能调用新父类的方法。

比如:

#!/usr/bin/env python2.7
class base1(object): # class base2(object):
def __init__(self): # def __init__(self):
print "base1 class" # print "base2 class" # 若继承父类需要换成base2
class A(base1): # class A(base2):
def __init__(self): # def __init__(self):
base1.__init__(self) # base2.__init__(self) class B(base1): # class B(base2):
def __init__(self): # def __init__(self):
super(B, self).__init__() # super(B, self).__init__()

这里要注意的是由于super将传入self作为调用__init__默认的第一个变量,因此在声明的时候不需要显式表示self。此外由于super返回的是代理对象,因此父类只能调用一次,也就避免了如下异常的可能性。

base1 = A
base1() # 无限递归

而在多类继承中super()是必不可少的(多类继承是python的一大特色),super()的__mro__变量记录了方法解析搜索顺序,既一个类的所有父类的调用顺序(MRO用来保证多类继承的时候各父类被逐一调用并只被调用一次)。例如:

class minin(base1):
def __init__(self):
print "mixin"
super(mixin, self).__init__() class C(B, mixin): # 1. mixin类插入到了B类和base1类之间
pass ChildC()
ChildC.__mro__ # 2. 方法解析顺序(MRO): C -> B -> mixin -> base1

在上述调用中,base1类不再是C类实例中B类的父类。如果self是C类实例,super(B, self)将指向mixin类。

对于多类继承,各子类的调用顺序可以参考这篇文章:python super()

参考:

  1. super函数官方文档
  2. https://rhettinger.wordpress.com/2011/05/26/super-considered-super/
  3. http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html
  4. http://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods
  5. http://stackoverflow.com/questions/222877/how-to-use-super-in-python/33469090#33469090

Python中super函数的用法的更多相关文章

  1. Python中int()函数的用法浅析

      int()是Python的一个内部函数 Python系统帮助里面是这么说的 >>> help(int)  Help on class int in module __builti ...

  2. Python中split()函数的用法及实际使用示例

    Python中split()函数,通常用于将字符串切片并转换为列表. 一.函数说明: split():语法:str.split(str="",num=string.count(st ...

  3. python中range()函数的用法

    python中range()函数可创建一个整数列表,一般用在for循环中. range()函数语法: range(start,stop[,step]) 参数说明: star: 计数从star开始.默认 ...

  4. python中super()的一些用法

    在看python高级编程这本书的时候,在讲到super的时候,产生了一些疑惑,super在python中的用法跟其他的语言有一些不一样的地方,在网上找了一些资料,发现基本上很少有文章能把我的疑惑讲明白 ...

  5. python中strip函数的用法

    python中往往使用剥除函数strip()来对用户的输入进行清理.strip函数的最一般形式为: str.strip('序列') 其中,序列是一段字符串,该函数表示从头或者从尾部开始进行扫描,如果扫 ...

  6. [转].Python中sorted函数的用法

    [Python] sorted函数 我们需要对List.Dict进行排序,Python提供了两个方法对给定的List L进行排序,方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副 ...

  7. python中open函数的用法

    用法如下: name = open('errname.txt','w')name.readline()name.close() 1.看下第一行的代码 用来访问磁盘中存放的文件,可以进行读写等操作,例如 ...

  8. Python中sorted函数的用法(转)

    [Python] sorted函数 我们需要对List.Dict进行排序,Python提供了两个方法 对给定的List L进行排序, 方法1.用List的成员函数sort进行排序,在本地进行排序,不返 ...

  9. Python中print()函数的用法详情

    描述 print() 方法用于打印输出,最python中常见的一个函数. 在交互环境中输入help(print)指令,可以显示print()函数的使用方法. >>> help(pri ...

随机推荐

  1. Mongodb异常关闭重启失败解决

    情况再现,连接mongodb的网站没有关,直接关闭了mongodb的cmd窗口.再次打开mongodb出现失败. 解决办法:网上说是删除 *.lock文件,再进行 --repair ,最后再打开mon ...

  2. nodejs 框架安装生成app

    下载nodejs解压到opt目录$ cd /usr/local/bin$ sudo ln -s /opt/node-v5.1.0-linux-x64/bin/node$ sudo ln -s /opt ...

  3. You Only Live Once

    从做 PreAngel 以来,每年我都会抽空去美国一两次,主要是在硅谷(湾区)一带见见当地的朋友,他们主要有 VC.创业者.斯坦福和伯克利的学生创业组织负责人.无线科技领域的各种组织机构负责人等,我一 ...

  4. Linux-Big-Endian和Little-Endian转换

    转自:http://blog.csdn.net/aklixiaoyao/article/details/7548860 在各种计算机体系结构中,对于字节.字等的存储机制有所不同,因而引发了计算机通信领 ...

  5. Python的平凡之路(9)

    一.Paramiko模块练习 1. Paramiko模块介绍 Paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接   2 .SSHclie ...

  6. SDR 研究

    最近终于买了一个RTL2832u 电视棒,可以软件无线电了 使用我的小米3开发板 (安卓6.0),直接在应用商店里搜索 "sdr",到豌豆荚中,就有“RTL驱动程序” 点击下载安装 ...

  7. OSI模型

    1.物理层 •设备间接收或发送比特流 •说明电压.线速和线缆等 例子: EIA/TIA-232 V.35 2. 数据链路层 •将比特组合成字节进而组合成帧 •用MAC地址访问介质 •错误发现但不能纠正 ...

  8. 三部曲一(数据结构)-1024-Eqs

    解方程整数解的题,通过这道题我学会了这种题的一般做法,对于未知数较少.取值范围较小且解为整数的方程,把一半的未知数移到等式的另一边,然后对两边分别枚举,用哈希配对,如果有相同的结果就找到一组解.具体做 ...

  9. Android 中Thread,Handler,Loop学习

    1.先看一下最简单的进度条示例 EG: package com.sxz.android.thread; import java.util.concurrent.atomic.AtomicBoolean ...

  10. Python 决策树的构造

    上一节我们学习knn,kNN的最大缺点就是无法给出数据的内在含义,而使用决策树处理分类问题,优势就在于数据形式非常容易理解. 决策树的算法有很多,有CART.ID3和C4.5等,其中ID3和C4.5都 ...