Python中super函数的用法

时间:2023-03-08 17:57:57

之前看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://*.com/questions/576169/understanding-python-super-with-init-methods
  5. http://*.com/questions/222877/how-to-use-super-in-python/33469090#33469090