注意事项:super调用父类的方法是按照 mro 顺序来调用的,因此多继承中不一定调用的就是父类方法!!
目标:
1:掌握子类继承父类时调用父类方法的两种形式以及区别
2:掌握什么是多继承中的菱形继承(钻石继承)
2:掌握多继承中的mro顺序作用
一:子类继承父类时调用父类方法的两种形式以及区别
方法一:父类名.方法名(self,参数1,参数2……..) 例如 parent . init(self , name , age , gender)
方法二:super(). 方法名(参数1,参数2…..) 例如 super().init(name,age,gender)
两种方法的区别:第一种方法继承时要传递参数 self 第二种方法不需要传递 self !!
图示:
父类名.方法名(self,参数1,参数2……..)
super(). 方法名(参数1,参数2…..)
二:什么是多继承中的菱形继承(钻石继承)
图示:
注意事项:
1:出现菱形继承时,如果操作不当(利用父类名调用父类方法),可能会出现祖父类的某方法调用多次(只想调用一次),这是我们必须要用super()继承父类方法来解决这一问题!!!
2:因此在多继承中应该尽量避免使用父类名.父类方法 这种形式调用父类的方法,会造成有的父类方法调用两次,使用super调用了完美解决
三:多继承中的mro顺序作用
使用语法:
1:类名.mro()
2:类名.mro
注意事项:
1:多继承中利用 super 调用父类的方法,不一定是调用父类的方法,而是按照多继承中的 mro 顺序来调用的
2:如果子类利用super调用父类方法,父类中没有super方法 就不会按照 mro 顺序调用方法,因此要想按照 mro 顺序调用方法,必须要求所有参与继承的家族类中都要有 super方法!**