之前看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. 0518Scrum项目5.0

    1.团队成员完成自己认领的任务. 2.燃尽图:理解.设计并画出本次Sprint的燃尽图的理想线.参考图6. 3.每日立会更新任务板上任务完成情况.燃尽图的实际线,分析项目进度是否在正轨.    每天的 ...

  2. SQL SERVER CURSOR游标的使用(转载)

    一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据 ...

  3. Josephu--Java链表实现

    public class Josephu { public static void main(String[] args) { Cyclink cyclink=new Cyclink(); cycli ...

  4. C语言学习常识

    开发环境 学习C语言,在mac os x上,我们选用的开发工具是x-code:而在Windows上,我们一般用微软提供的vc6.0:此外还有很多编辑器内置了或者支持下载C语言的编译器插件.所以,我们可 ...

  5. OC基础--Hello Shit

    /*  Foundation.h为主头文件, 主头文件中又拷贝了该工具箱中所有工具的头文件, 我们只需要导入主头文件就可以使用该工具箱中所有的工具, 避免了每次使用都要导入一个对应的头文件  工具箱的 ...

  6. String类实现

    String类是应用框架中不可或缺的类 重载运算符实现字符串的操作 #idndef IOTECK_STRING_H_#define IOTECK_STRING_H_namespace iotek{ c ...

  7. php常量的声明和使用

    (1)声明 define("var",value) (2)先声明后使用 (3)默认区分大小写,如要不区分 define ("var",value,true); ...

  8. C++复习-练习-1

    上周做多媒体技术的作业,JPEG编码问题:FDCT.量化.逆量化和IDCT,只是简单套公式,但还是感觉自己C++好渣...太久没做,手生了,可怕可怕. 所以复习了下文件操作和..基础操作.这里贴一些当 ...

  9. iOS 动画 旋转 移动简单代码

    #import "ViewController.h" @interface ViewController () { UIImageView *imgView; BOOL flag; ...

  10. 详解Android功耗分析工具Power Tutor的使用

    简介: PowerTutor 是由美国密歇根大学在谷歌的指导下开发的.它是用来展示google智能手机中主要组件或应用功耗的一种应用程序.例如,CPU,网络链接,LCD显示屏,GPS等.它允许开发者很 ...