多继承以及MRO顺序

重写和重载:重写是覆盖父类的方法
                    重载可以根据传入参数的不同而调用对应的函数
多继承的三种写法:
  1. 子类(孙类)0的方法中写父类.父类方法名(*args,**kargs)    这种写法如果子类很多,当创建一个对象,定义这个对象的类继承了多个子类时,父类方法将被调用多次
  2. 子类(孙类)的方法中写super().父类方法名(*args,**kargs)  这种写法会根据C3算法的结果,按顺序从子类、父类的方法中依次调用,能够保证类方法都只调用一次。C3算法的结果可以用 子类.__mro__ 得到
  3. 子类(孙类)的方法中写super(子类名,self).父类方法名(*args,**kargs)  这种写法会根据C3算法的结果,从传入子类名开始依次往后按顺序调用子类、父类的方法
总结:
  1. super().__init__相对于类名.__init__,在单继承上用法基本无差
  2. 但在多继承上有区别,super方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次
  3. 多继承时,使用super方法,对父类的传参数,应该是由于python中super的算法导致的原因,必须把参数全部传递,否则会报错
  4. 单继承时,使用super方法,则不能全部传递,只能传父类方法所需的参数,否则会报错
  5. 多继承时,相对于使用父类.__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传递
posted @ 2020-04-20 00:56  组装梦想  阅读(138)  评论(0编辑  收藏  举报