问题:多继承中Son1、Son2继承自Parent,Grandson继承自Son1和Son2。若用类名.的方式调用父类方法,父类方法会被多次调用。
解决:若用super().的方法不会导致父类方法被多次调用,可以保证每个父类的方法只执行一次。
原因:__MRO__中元组的先后顺序决定了调用父类super的顺序。
python3里有一种默认的来处理多继承调用的先后顺序叫C3算法,是一种确定每个类只调用一次的算法,这个算法的最终一个体现是:当写上最底下类的名字.__MRO__时,可以看到C3算法的最终结论,这个结论是一个元组,有很多类的名字,类的名字的先后顺序就是调用类的顺序。如果用super(),当前类名是什么,找到下一个后就调用下一个。如果用super(XX,self),可以指定调用XX 的下一个。
补充:调用父类的三个方法:
# Parent.__init__(self)
# super().__init__()
# super(Son,self).__init__()