super() 函数是用于调用父类(超类)的一个方法。
super() 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 来实现,比如
#!/usr/bin/python3 #coding:utf-8 class Base: def __init__(self, a): self.a = a def add(self, b): return self.a+b class Child(Base): def test(self, b): r = super(Child, slef).add(b) print(r) child = Child(1) child.test(4)打印:
5
Child是Base的子类,当我们在子类中的函数中调父类的方法时,无需再指明父类名称,这样在需要修改父类名称shif时不会影响子类的调用
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表
super工作原理
def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1]
其中,cls 代表类,inst 代表实例,上面的代码做了两件事:
获取 inst 的 MRO 列表
查找 cls 在当前 MRO 列表中的 index, 并返回它的下一个类,即 mro[index + 1]
当你使用 super(cls, inst) 时,Python 会在 inst 的 MRO 列表上搜索 cls 的下一个类