多继承以及MRO顺序
重写和重载:重写是覆盖父类的方法
重载可以根据传入参数的不同而调用对应的函数
多继承的三种写法:
-
子类(孙类)0的方法中写父类.父类方法名(*args,**kargs) 这种写法如果子类很多,当创建一个对象,定义这个对象的类继承了多个子类时,父类方法将被调用多次
-
子类(孙类)的方法中写super().父类方法名(*args,**kargs) 这种写法会根据C3算法的结果,按顺序从子类、父类的方法中依次调用,能够保证类方法都只调用一次。C3算法的结果可以用 子类.__mro__ 得到
-
子类(孙类)的方法中写super(子类名,self).父类方法名(*args,**kargs) 这种写法会根据C3算法的结果,从传入子类名开始依次往后按顺序调用子类、父类的方法
总结:
-
super().__init__相对于类名.__init__,在单继承上用法基本无差
-
但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次
-
多继承时,使用super方法,对父类的传参数,应该是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错
-
单继承时,使用super方法,则不能全部传递,只能传父类方法所需的参数,否则会报错
-
多继承时,相对于使用父类.__init__方法,要把每个父类全部写一遍,而使用super方法,只需写一句话便执行了全部父类的方法,这也是为何多继承需要全部传参的一个原因
1 class Parent(object): 2 x = 1 3 4 class Child1(Parent): 5 pass 6 7 class Child2(Parent): 8 pass 9 10 print(Parent.x, Child1.x, Child2.x) 11 Child1.x = 2 12 print(Parent.x, Child1.x, Child2.x) 13 Parent.x = 3 14 print(Parent.x, Child1.x, Child2.x) 15 16 17 18 # 输出 19 1 1 1 20 1 2 1 21 3 2 3
*arg,**kargs的另外用处 拆包:
-
*args和**kargs不仅能出现在形参,也能出现在实参
-
当出现在实参时,会将传递的参数进行拆包传递到函数内。元组拆成*args传递,字典拆成**args传递