教你学会使用Python学习之类的继承super!

教你学会使用Python学习之类的继承super![Python常见问题]

 

看了网上许多关于super、mro、C3的介绍感觉没有一份很容易初学者理解的文档,直接看C3算法的话,比较难理解,也没必要,如果掌握一套规律的话,会轻松许多。我将网上这些博主的文章进行一个梳理总结,最后形成一套实用的关于super、mro、C3的理解介绍。

 

1、super

super()是一种将子类与父类联系起来的一种方法,子类通过继承父类,可以使用父类的方法和属性,也可以自己定义属于自己的方法和属性。super方法主要用在多继承中,在单继承时直接调用父类方法即可

下面这个是SGD源码的一部分,根据这份源码,

class SGD(Optimizer):    def __init__(self, params, lr=required, momentum=0, dampening=0,                 weight_decay=0, nesterov=False):        defaults = dict(lr=lr, momentum=momentum, dampening=dampening,                        weight_decay=weight_decay, nesterov=nesterov)        if nesterov and (momentum <= 0 or dampening != 0):            raise ValueError("Nesterov momentum requires a momentum and zero dampening")        super(SGD, self).__init__(params, defaults)    def __setstate__(self, state):        super(SGD, self).__setstate__(state)        for group in self.param_groups:            group.setdefault("nesterov", False)这是SGD类中的代码

有2点需要补充说明:

1、super联系父类的时候,需要调用父类的方法,包括所带的形参写完整,子类不够的形参需要额外加上

2、super联系父类的时候,不只是可以调用__init__,而且还可以调用父类其他的方法

3、python3可以写成super().__init__()这种写法了。

4、类都默认继承object类

 

另外,在super的使用过程中,还需要注意初始化对继承的影响:

1、子类继承父类,但不执行__init__方法,那么会自动继承父类属性。

2、子类继承父类,执行了__init__方法,且不调用super初始化父类构造函数,那么子类不会自动继承父类属性。

3、子类继承父类,执行了__init__方法,且调用了super初始化了父类的构造函数,那么子类会继承父类属性。

 

2、mro

Python的MRO,方法解析顺序,即在调用方法时,会对当前类以及所有的基类进行一个搜索,以确定该方法之所在,而这个搜索的顺序就是MRO。然后python会按照这个顺序去执行类之间的调用问题。

直接上例子

class A1():
    def __init__(self):
        print("A1")
        super().__init__()
class A2():
    def __init__(self):
        print("A2")
        super().__init__()
class A3():
    def __init__(self):
        print("A3")
        super().__init__()
class B1(A1, A2):
    def __init__(self):
        print("B1")
        super().__init__()
class B2(A2):
    def __init__(self):
        print("B2")
        super().__init__()
class B3(A2, A3):
    def __init__(self):
        print("B3")
        super().__init__()
class C1(B1):
    def __init__(self):
        print("C1")
        super().__init__()
class C2(B1, B2):
    def __init__(self):
        print("C2")
        super().__init__()
class C3(B2, B3):
    def __init__(self):
        print("C3")
        super().__init__()
class D(C1, C2, C3):
    def __init__(self):
        print("D")
        super().__init__()

d = D()
print(D.__mro__)

输出如下:

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 教你学会使用Python学习之类的继承super!