本篇文章给大家分享的是有关Python类继承超级的原因,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
1,超级
超级()是一种将子类与父类联系起来的一种方法,子类通过继承父类,可以使用父类的方法和属性,也可以自己定义属于自己的方法和属性.super方法主要用在多继承中,在单继承时直接调用父类方法即可
下面这个是SGD源码的一部分,根据这份源码,
类SGD(优化): def __init__(自我,params, lr=要求,动力=0,抑制=0, weight_decay=0, nesterov=False): 缺省值=dict (lr=lr,动量=动量,抑制=抑制, weight_decay=weight_decay nesterov=nesterov) 如果nesterov(动量& lt;=0或抑制!=0): 提高ValueError (“Nesterov动量要求动量和零dampening") 超级(SGD,自我)。__init__(参数,默认值) def __setstate__(自我状态): 超级(SGD,自我).__setstate__(状态) 集团在self.param_groups: group.setdefault (& # 39; nesterov& # 39;, False)
这是SGD类中的代码
有2点需要补充说明:
1,超联系父类的时候,需要调用父类的方法,包括所带的形参写完整,子类不够的形参需要额外加上
2,超级联系父类的时候,不只是可以调用__init__,而且还可以调用父类其他的方法
3, python3可以写成超级(). __init__()这种写法了。
4类都默认继承对象类
另外,在超级的使用过程中,还需要注意初始化对继承的影响:
1,子类继承父类,但不执行__init__方法,那么会自动继承父类属性。
2,子类继承父类,执行了__init__方法,且不调用超级初始化父类构造函数,那么子类不会自动继承父类属性。
3,子类继承父类,执行了__init__方法,且调用了超级初始化了父类的构造函数,那么子类会继承父类属性。
2, mro
Python的mro,方法解析顺序,即在调用方法时,会对当前类以及所有的基类进行一个搜索,以确定该方法之所,在而这个搜索的顺序就是mro。然后Python会按照这个顺序去执行类之间的调用问题。
直接上例子
类A1 (): def __init__(自我): 打印(& # 39;a1 # 39;) super () . __init__ () 类A2 (): def __init__(自我): 打印(& # 39;a2 # 39;) super () . __init__ () 类A3 (): def __init__(自我): 打印(& # 39;a3 # 39;) super () . __init__ () 类B1 (A1, A2): def __init__(自我): 打印(& # 39;b1 # 39;) super () . __init__ () 类B2 (A2): def __init__(自我): 打印(& # 39;b2 # 39;) super () . __init__ () 类B3 (A2、A3): def __init__(自我): 打印(& # 39;b3 # 39;) super () . __init__ () 类C1 (B1): def __init__(自我): 打印(& # 39;c1 # 39;) super () . __init__ () 类C2 (B1, B2): def __init__(自我): 打印(& # 39;c2 # 39;) super () . __init__ () 类C3 (B2, B3): def __init__(自我): 打印(& # 39;c3 # 39;) super () . __init__ () 类D (C1, C2, C3): def __init__(自我): 打印(& # 39;d # 39;) super () . __init__ () d=d () 打印(D.__mro__)
输出如下:
(& lt;类& # 39;__main__.D& # 39;祝辞,& lt;类& # 39;__main__.C1& # 39;祝辞,& lt;类& # 39;__main__.C2& # 39;祝辞,& lt;类& # 39;__main__.B1& # 39;祝辞,& lt;类& # 39;__main__.A1& # 39;祝辞,& lt;类& # 39;__main__.C3& # 39;祝辞,& lt;类& # 39;__main__.B2& # 39;祝辞,& lt;类& # 39;__main__.B3& # 39;祝辞,& lt;类& # 39;__main__.A2& # 39;祝辞,& lt;类& # 39;__main__.A3& # 39;祝辞,& lt;类& # 39;对象# 39;祝辞)
那么这个程序是按怎么个顺序依次去执行那些方法呢,就是按照MRO中的顺序。
那么这个顺序如何自己手写出来呢?这就是C3算法,用于计算出MRO,得出执行顺序
3, C3算法
但是我在这里想告诉大家如何根据C3算法找出规律,从而自己写出顺序
还是上手例子,根据上面这个图,我们可以列出下面这个表,这个表示网上一个博主做的,可以说做出这张表就是做出了答案,那这张表“实际取出的类“怎么推出来的呢?我拿过来提炼出一些比较直接的规律