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/