super()方法的漂亮之处在于,你不需要在定义子类构造器时,明确的指定子类的基类并显式的调用,即不需要明确的提供父类,这样做的好处就是,如果你改变了继承的父类,你只需要修改一行代码(class代码行),而不需要在大量代码中去查找那个要修改的基类。另外一方面代码的可移植性和重用性也更高。
1、单继承
class FooParent(object):
def __init__(self):
self.parent = 'I\'m the parent.'
print ('Parent')
def bar(self,message):
print (message,'from Parent')
class FooChild(FooParent):
def __init__(self):
super(FooChild,self).__init__()
print ('Child')
def bar(self,message):
super(FooChild, self).bar(message)
print ('Child bar fuction')
print (self.parent)
if __name__ == '__main__':
fooChild = FooChild()
fooChild.bar('HelloWorld')
答案是:
Parent
Child
HelloWorld from Parent
Child bar fuction
I'm the parent.
2、多继承
class A:
def __init__(self):
#print(super())
print("Enter A")
print("Leave A")
class B(A):
def __init__(self):
print("Enter B")
#print(super())
super().__init__()
print("Leave B")
# single = B()
# print(B.mro())
class C(A):
def __init__(self):
print("Enter C")
print(super())
super().__init__()
print("Leave C")
class D(B,C):
def __init__(self):
print("Enter D")
#print(super())
super().__init__()
print("Leave D")
D()
print(D.mro())
结果:
Enter D
Enter B
Enter C
<super: <class 'C'>, <D object>>
Enter A
Leave A
Leave C
Leave B
Leave D
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]