在Python3里面,有多继承的时候,每每会出现调用Super失败的状况。Python里存在一种多继承 Super的调用顺序(C3算法
),保证每一个类调用一次。
体现:类名.__mro__
使用Super时,调用当前类的下一个类的方法python
屡次调用:算法
class Parent(object): def __init__(self,name): print('parent 开始调用') self.name = name print('Parent 调用完成') class Son1(Parent): def __init__(self,name,age): print('Son1 调用') self.age = age Parent.__init__(self,name) print('Son1 调用完成') class Son2(Parent): def __init__(self,name,gender): print('Son2 调用') self.gender = gender Parent.__init__(self, name) print('Son2 调用完成') class Grandson(Son1,Son2): def __init__(self,name,gender,age): print('Grandson 调用') self.gender = gender self.age = age Son1.__init__(self,name,age) #单独调用父类方法 Son2.__init__(self,name,gender) print('Grandson 调用完成') s = Grandson('123','男',19) """ Grandson 调用 Son1 调用 parent 开始调用 Parent 调用完成 Son1 调用完成 Son2 调用 parent 开始调用 Parent 调用完成 Son2 调用完成 Grandson 调用完成 """
防止调用父类调用屡次code
class Parent(object): def __init__(self,name,*args,**kwargs): print('parent 开始调用') self.name = name print('Parent 调用完成') class Son1(Parent): def __init__(self,name,age,*args,**kwargs): print('Son1 调用') self.age = age super().__init__(self,name,*args,**kwargs) print('Son1 调用完成') class Son2(Parent): def __init__(self,name,gender,*args,**kwargs): print('Son2 调用') self.gender = gender super().__init__(self,name,*args,**kwargs) print('Son2 调用完成') class Grandson(Son1,Son2): def __init__(self,name,gender,age): print('Grandson 调用') self.gender = gender self.age = age super().__init__(name,gender,age) # == super(Grandson, self).__init__(name,gender) print('Grandson 调用完成') s = Grandson('123','男',19) """ Grandson 调用 Son1 调用 Son2 调用 parent 开始调用 Parent 调用完成 Son2 调用完成 Son1 调用完成 Grandson 调用完成"""
在 Python 中用到多继承时,调用父类方法很容易出错:父类方法调用了屡次,只能经过__mro__魔法方法来获取调用顺序继承
print(Grandson.__mro__) #查看调用顺序 """ (<class '__main__.Grandson'>, <class '__main__.Son1'>, <class '__main__.Son2'>, <class '__main__.Parent'>, <class 'object'>) """ #super().__init__(name,gender,age) == super(Grandson, self).__init__(name,gender) super(Son1,self).__init__(name,age,gender) """ Grandson 调用 Son2 调用 parent 开始调用 Parent 调用完成 Son2 调用完成 Grandson 调用完成 """