python笔记 super上

55 阅读1分钟

我正在参加「掘金·启航计划」

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 前言

当我一开始刚接触别人的项目时(刘姥姥进大观园的赶脚),当看到django每个app里的models.py,满眼望过去,就会看到各种super()的调用,一脸蒙,比如super().save,super().delete,如下截图: image.png

image.png

image.png

第一次接触python的项目时,当时的疑问就是直接某某.删除/保存不就行啦,哪怕事后再看也是一目了然,但用super不仅复杂的,而且再回头看的话,还要稍微重新理一遍,岂不是很麻烦,而且为啥要绕个大圈子呢(对于新手也太不友好了吧,还有调用父类的方法究竟有什么好处呢)。

2 super

如下代码:我新建了Base类,只有一个run方法,另一个Demo类继承了Base类,定义了run和show方法,并且show方法调用run方法,结果如下图。

class Base:
    def run(self):
        print("Base run") 

class Demo(Base):
    def run(self):
        print("Demo run")        

    def show(self):
        super().run()

if __name__ == '__main__':
    Demo().show()   

image.png

一看到super().run(),我们就知道调用了父类的方法,而不是Demo中的方法。那这里的super方法帮我们做了什么呢。别看这里的super方法里面空空如也,但它相当于super(Demo, self).run(),如下图。 image.png

3 小结

没有遇到有点绕的super方法时,本能看到super方法,就知道调用的是父类的方法,但是它具体怎么调用的呢,比如super().run()就等同于super(Demo, self).run()