python super() 用法浅理解
本文仅代表作者自己的一点小理解,如果有错误的的放请大家多多指正
当我们调用父函数的时候,Python2 是这样处理的:
class Person(object):
def __init__(self):
print('我是Person类的构造函数')
class Child(Person):
def __init__(self):
print('我是Child类的构造函数')
Person.__init__(self)
他知识用父函数的名字调用, 如果有一天你修改了基类名字,那么就会报错:
这时候Python3中就用到了 super, super意思是,可以不用管基类的名字,直接查找调用基类方法。
class Persons(object):
def __init__(self):
print('我是Person类的构造函数')
class Child(Person):
def __init__(self):
print('我是Child类的构造函数')
super(Child, self).__init__(self)
但是又出现一个问题,怎么知道super调用的是哪个基类呢,这时候就用到了super的关键信息MRO(Method Resolution Order 方法解析顺序),
MRO 方法解析顺序。 该怎么理解呢, 这时候你如果查看一下子类的mro 你就会理解了通过 子类名.mro() 来看下
print(Child.mro())
#输出
'''
[<class '__main__.Child'>, <class '__main__.Person'>, <class 'object'>]
'''
这个MRO 指的就是 这个子类的基类,以及基类的基类,它会生成一个类似列表的存在, 你可以看到子类的基类是Person,Person的基类是object。
所以,当只有一个基类,那么super所调用的就是Person类的方法 。
问题又出现了,如果是多个基类呢?
多继承的情况下, 比如D继 C和A,C 继承B,B继承object,A继承object类。
class A(object):
def __init__(self):
print('我是A类方法')
class B(object):
def classname(self):
print('我是B类方法')
class C(B):
def classname(self):
print('我是C类方法')
#super(C, self).__init__()
class D(C,A):
def __init__(self):
super(D, self).__init__()
print('我是D类方法')
此时的D的MRO为
print(D.mro())
'''
[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
'''
结果显示
d = D()
'''
我是A类方法
我是D类方法
'''
为什么呢, 因为调用D的MRO 为 D-C-B-A-object , super查找D的第一个基类C类没有__init__() 方法,然后第二个基类B 也没有,第三个基类A类,找到了,打印A,然后返回D类再打印D
ps: 总觉得还差点什么,emmmm 回头想起来再补上
所以说super函数是根据他的MRO顺序来的。