super的用法

super的用法

不用写父类名

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。

super(FooChild, self).bar(message) = FooParent.bar(self,message)

从运行结果上看,普通继承和super继承是一样的。但是其实它们的内部运行机制不一样,这一点在多重继承时体现得很明显。在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照mro进行的(E.mro)。

Python类分为两种,一种叫经典类,一种叫新式类。两种都支持多继承。

考虑一种情形,B继承于A,C继承于A和B, 但C需要调用父类的init()函数时,前者会导致父类A的init()函数被调用2次,这是不希望看到的。而且子类要显式地指定父类,不符合DRY原则。

采用新式类,要求最顶层的父类一定要继承于object,这样就可以利用super()函数来调用父类的init()等函数,每个父类都执行且执行一次,并不会出现重复调用的情况。而且在子类的实现中,不用到处写出所有的父类名字,符合DRY原则。

默认情况下用户定义的类为经典类,新类需要继承自所有类的基类 object 或者继承自object的新类。

现在基本都是新式类

参考:
[1] https://blog.csdn.net/lqhbupt/article/details/19631991
[2] http://www.runoob.com/python/python-func-super.html
[3] http://www.jackyshen.com/2015/08/19/multi-inheritance-with-super-in-Python/

posted @ 2022-06-22 09:45  xiaoxuxli  阅读(88)  评论(0编辑  收藏  举报