super解决的问题是:
python的面向对象有多重继承的特点,子类继承父类。
如果采用非绑定的类方法,用父类名来引用的方法,并在参数列表中引入待绑定的对象self,从而达到调用父类的目的。
这样的缺点就是当子类的父类发生变化是,必须遍历整个类定义,把所有的通过非绑定的方法的类名都全部替换过来。
super用来解决多重继承的问题,解耦了子类和父类之间的绑定。使用多重继承,会涉及到查找顺序(MRO),重复调用(钻石继承)等问题。
super继承和指明父类的继承内部运行机制不一样,在super机制里可以保证公共父类仅被执行一次。
新式类:有继承的类。super继承只能用于新式继承,如果没什么想继承的,可以继承object。
经典类:没有父类,不能调用super。
实例说明:
非super的用法
class A:
def __init__(self):
print "enter A"
print "leave A"
class B(A):
def __init__(self):
print "enter B"
A.__init__(self)
print "leave B"
super的用法
class A(object): # A是新式类
def __init__(self):
print "enter A"
print "leave A"
class B(C): # 只需要将A改为C
def __init__(self):
print "enter B"
super(B, self).__init__() ##调用super来继承父类,即使父类变更了,也不需变更此处。
print "leave B"