super()的个人理解和疑问
class Base(object):
def __init__(self):
print ("enter Base")
print ("leave Base")
class A(Base):
def __init__(self):
print ("enter A")
Base().__init__() # Base().__init__() 等价于 d= Base() d.__init__()。做了两件事,一个是实例化Base,自动执行了一次init,
print ("leave A") # 然后再调用了一次实例中的init,所以Base中的打印语句会有两次。
class B(Base):
def __init__(self):
print ("enter B")
c= Base()
c.__init__()
print ("leave B")
class C(A, B):
def __init__(self):
print ("enter C")
A().__init__()#这里的语句已经特别地指明了实例化A,所以C()里的参数A和B是不需要的。
B().__init__()
print ("leave C")
a = C() #实例化C
>>>
enter C #开始执行实例C中的初始化init
enter A #进入了A的继承,再执行Base的init两次,构成A Base Base Base Base A两次
enter Base
leave Base
enter Base
leave Base
leave A
enter A
enter Base
leave Base
enter Base
leave Base
leave A
enter B #进入B的继承,又执行Base的init两次,构成B base base base base B
enter Base
leave Base
enter Base
leave Base
leave B
enter B
enter Base
leave Base
enter Base
leave Base
leave B
leave C #执行完C的init
#不难看到,如果不使用super的话,会出现实例化时的重复调用
使用super:
class People(object):
def show_my_power(self):
print(u"people")
class Singer(People):
def show_my_power(self):
super(Singer,self).show_my_power() #当使用super时、会有一个广度优先搜索树,此语句是找父类中的show_my_power,因为是广度搜索,所以是
print(u'singer') #会找到actor里的show_my_power。
class Actor(People):
def show_my_power(self):
super(Actor,self).show_my_power() #actor中的show_my_power被找到,再往上找父类,找到people,并执行people中的show_my_power
print(u'actor') # 当执行完people中的show_my_power时,原路返回,打印actor,再打印singer
class Artist(Singer,Actor):
pass
a = Artist()
a.show_my_power()
print(a.mro())
>>>
people
actor
singer
[<class '__main__.Artist'>, <class '__main__.Singer'>, <class '__main__.Actor'>, <class '__main__.People'>, <class 'object'>]
一个存疑的实验:
class ex(object):
def show_my_power(self):
print("ex")
class People(object):
def show_my_power(self):
print(u"people")
class C(People):
def show_my_power(self):
super(C,self).show_my_power()
print(u'C')
class Singer(ex):
def show_my_power(self):
super(Singer,self).show_my_power()
print(u'singer')
class Actor(People):
def show_my_power(self):
super(Actor,self).show_my_power()
print(u'actor')
class Artist(Actor,Singer,C):
pass
if __name__ == "__main__":
Artist().show_my_power()
print(Artist.mro()) #下方的mro树显示
>>>
ex
singer
actor
[<class '__main__.Artist'>, <class '__main__.Actor'>, <class '__main__.Singer'>, <class '__main__.ex'>, <class '__main__.C'>, <class '__main__.People'>, <class 'object'>]
object | object | |
---|---|---|
People | ex | People |
Actor | Singer | C |
Artist |
继承关系如上表,则画继承树时,应该是Artist——Actor——Singer——C……等才对,为何Singer后面是ex,就不得而知了,而且执行过程直接绕过了C,不知道为什么。