Python类继承超级的原因

  介绍

本篇文章给大家分享的是有关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__) 

输出如下:

 Python类继承超级的原因

(& 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中的顺序。

 Python类继承超级的原因

那么这个顺序如何自己手写出来呢?这就是C3算法,用于计算出MRO,得出执行顺序

3, C3算法

但是我在这里想告诉大家如何根据C3算法找出规律,从而自己写出顺序

还是上手例子,根据上面这个图,我们可以列出下面这个表,这个表示网上一个博主做的,可以说做出这张表就是做出了答案,那这张表“实际取出的类“怎么推出来的呢?我拿过来提炼出一些比较直接的规律

 Python类继承超级的原因

Python类继承超级的原因