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

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

MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。

示例代码

super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类 FooChild 的对象转换为类 FooParent 的对象

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class FooGrandpa(object):
    def __init__(self):
        self.parent = 'Grandpa'
        print('Grandpa init')

    def print_name(self, message):
        print("Grandpa print_name:", message)

class FooParent(FooGrandpa):
    def __init__(self):
        super(FooParent, self).__init__()
        print('Parent init')

    def print_name(self, message):
        super(FooParent, self).print_name(message)
        print("Parent print_name:", message)


class FooChild(FooParent):
    def __init__(self):
        # super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类 FooChild 的对象转换为类 FooParent 的对象
        super(FooChild, self).__init__()
        print('chile init')

    def print_name(self, message):
        super(FooChild, self).print_name(message)
        print("child print_name:", message)
        print(self.parent)



if __name__ == '__main__':
    message = "signal"
    fooChild = FooChild()
    fooChild.print_name(message)

输出:

Grandpa init
Parent init
chile init
'Grandpa print_name:', 'signal'
'Parent print_name:', 'signal'
'child print_name:', 'signal'
Grandpa

参考:

  1. Python super() 函数