python super() 用法浅理解

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顺序来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值