超级有用的工具 super()
超级有用的工具 super()
Ihonghong 发表于1年前
超级有用的工具 super()
  • 发表于 1年前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

如何正确使用super()函数,社实际上是人们在Python中理解最差的知识点之一。偶尔我们会看到一些代码直接电泳父类中的方法。就像这样:

  对于大部分的代码而言来说这样做都行得通,但是在设计多继承的代码里,这样会导致出现器官的麻烦。比如,考虑下面的例子:

结果如下,发现基类one被调用了两次,也许没什么毛病,但在一些情况下可能会产生严重的错误。

 

 

将代码改为用super():

 

 

 

发现每个构造函数都是用了一次,多么合理。

 

 

 

究其原因,针对每一个定义的类,Python都会计算出一个称为方法的解析顺序(MRO)的列表。MRO列表知识简单的对基类进行线性排列。这种排列不一定会按照我们声明的父类列表那样。这是通过复杂的计算实现的,我们不需要了解,例如上端代码的MRO列表是:

重要的一点是,就像MRO的顺序一样,从底层一层一层的传递,直到顶层的那个函数。这样就出现一种情况,当中间的某一个子类没有要调用的函数时,同样也会继续向上传递。就如下面的例子

    

 

 

 

尽管A类并没有spam()函数,但依然会向上传递。直到找到最上层的实际的spam()函数。尽管Python内部通过复杂的数学计算出了MRO列表让继承有了顺序有了参照。但这并不是最适当的顺序,甚至是不恰当的顺序,会造成严重的错误,比如在两个父类之间循环了,这就麻烦了。往往呢这样错误还挺多,这就要求我们在代码的设计过程中要不断测试。如果出现如下常见的错误提示:

代表着MRO是不恰当的顺序,这就要求我们尝试着调换父类的继承顺序了,一般都能解决。

 

提示:当父类比较多时,最好将同名的方法参数数量,参数名称相同,这样不影响结果,反而会确保super()能传递到上层最终的函数。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 3
码字总数 1560
×
Ihonghong
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: