Python高级编程(15):super真的是调用父类吗?
这一部分非常重要,我相信很多人心中一直觉得super函数就是调用父类,但是结果是这样吗,我们来好好聊一下这个super。我们先来看一段代码:
1 | class A: |
这个是没有问题的,很好理解,我们接着来看下一段代码:
1 | class A: |
有人说这不就是调用了父类的方法么,我暂且不说话。并向你扔了2个问题:
1、既然我们重写了B的构造方法,那么为什么还要去调用super?
2、super的执行顺序到底是怎样的?
我们先来看第一个问题:
1 | from threading import Thread |
这里我们想自己定义一个线程,我们发现在Thread这个函数里面就已经包含了name这个属性:
1 | def __init__(self, group=None, target=None, name=None,args=(), kwargs=None, *, daemon=None): |
这样我们完全可以使用父类Thread的name属性啊,为啥自己还要定义一个呢?自己定义一个虽说不是不可以,但是我们重点是要了解super的用法。
接下来看第二个问题:
1 | class A: |
假如super方法是调用父类的话,那么输出结果应该是D–>B–>A–>C,真的是这样吗,我们打印一下,结果却是D–>B–>C–>A,所以就不是调用父类的方法了,而是调用的顺序是根据前面的mro算法来的,不信我们可以打印一下:
1 | print(D.__mro__) |
看到没有,一模一样,所以super调用的不是父类,而是根据mro顺序来进行调用的。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 余思博客!
评论