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,不知道为什么。

posted @ 2020-08-10 21:13  Peskin  阅读(129)  评论(0)    收藏  举报