Python 基础教程

Python 流程控制

Python 函数

Python 数据类型

Python 文件操作

Python 对象和类

Python 日期和时间

Python 高级知识

Python 参考手册

Python super() 使用方法及示例

Python 内置函数

内置的super()函数用于调用父类(超类)的一个方法。

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

在Python中,super()有两个主要用例:

  • 使我们避免显式使用基类名称

  • 处理多重继承

示例1:具有单继承的super()

在单继承的情况下,它允许我们通过引用基类super()。

class Mammal(object):
  def __init__(self, mammalName):
    print(mammalName, '是一种温血动物。')
    
class Dog(Mammal):
  def __init__(self):
    print('狗有四条腿。')
    super().__init__('狗')
    
d1 = Dog()

输出结果

狗有四条腿。
狗 是一种温血动物。

在这里,我们使用代码调用了Mammal类的__init__()方法(来自Dog类)

super().__init__('Dog')

代替

Mammal.__init__(self, 'Dog')

由于在调用成员时不需要指定基类的名称,因此可以轻松更改基类名称(如果需要)。

# 将基类更改为CanidaeFamily
class Dog(CanidaeFamily):
  def __init__(self):
    print('狗有四条腿。')

    # 无需更改此
    super().__init__('狗')
super()内建返回一个代理对象,代替对象,可以通过委托调用基类的方法。这称为间接(使用super()引用基础对象的能力)

由于间接是在运行时计算的,因此我们可以在不同时间使用不同的基类(如果需要)。

示例2:具有多重继承的super()

class Animal:
  def __init__(self, Animal):
    print(Animal, '是动物');

class Mammal(Animal):
  def __init__(self, mammalName):
    print(mammalName, '是一种温血动物。')
    super().__init__(mammalName)
    
class NonWingedMammal(Mammal):
  def __init__(self, NonWingedMammal):
    print(NonWingedMammal, "不会飞。")
    super().__init__(NonWingedMammal)

class NonMarineMammal(Mammal):
  def __init__(self, NonMarineMammal):
    print(NonMarineMammal, "不会游泳。")
    super().__init__(NonMarineMammal)

class Dog(NonMarineMammal, NonWingedMammal):
  def __init__(self):
    print('狗有4条腿。');
    super().__init__('狗')
    
d = Dog()
print('')
bat = NonMarineMammal('蝙蝠')

输出结果

狗有4条腿。
狗 不会游泳。
狗 不会飞。
狗 是一种温血动物。
狗 是动物

蝙蝠 不会游泳。
蝙蝠 是一种温血动物。
蝙蝠 是动物

方法解析顺序(MRO)

方法解析顺序(MRO)是在存在多个继承的情况下应继承方法的顺序。您可以使用__mro__属性查看MRO 。

>>> Dog.__mro__
(<class 'Dog'>, 
<class 'NonMarineMammal'>, 
<class 'NonWingedMammal'>, 
<class 'Mammal'>, 
<class 'Animal'>, 
<class 'object'>)

这是MRO的工作方式:

  • 派生调用中的方法总是在基类的方法之前调用。
    在我们的示例中,在NonMarineMammal或NoneWingedMammal之前调用Dog类。 这两个类在Mammal之前调用,后者在Animal之前调用,而Animal类在对象(object)之前调用。

  • 如果有多个父类,比如Dog(NonMarineMammal,NonWingedMammal)这样有多个父类,则首先调用NonMarineMammal的方法,因为它首先出现。

Python 内置函数