多重继承

一个类,可以同时继承多个类,这就是派生继承

  1. class CNA(object):
  2. valA ="CNA"
  3. class CNB(object):
  4. valB ="CNB"
  5. class ClassName(CNA, CNB)
  6. def func(self):
  7. print(self.valA)
  8. print(self.valB)

二义性:多重继承引发的问题

在一段程序中其实不允许出现两个相同名称的属性或者方法,如果出现就会带来二义性的问题。 在简单的单一继承中不存在这种问题(要么报错,要么被派生类覆盖) 但是在多重继承,是会引发这种问题(当派生类,继承自两个具有相同属性的基类时,二义性就出现了)

案例1:属性或方法最终是来自同一个基类

假如两个基类的属性或者方法都来自同一个父类, 派生类是不会出现二义性问题

注意:只要属性或方法在继承过程中,任意一个环节被修改,就属于案例2

  1. class Parent(object): # 父类
  2. def func(self):
  3. print("this is Parent")
  4. return None
  5. class CNA(Parent): # 基类A
  6. pass
  7. class CNB(Parent): # 基类B
  8. pass
  9. class ClassName(CNA, CNB) # 派生类
  10. pass
  11. obj = ClassName()
  12. obj.func() # func被CNA、CNB继承,
  13. # 而className的func是来自CNA和CNB,看上去出现了二义性
  14. # 但最终方法func来自同一个父类Parent
  1. # 输出
  2. #======================================
  3. this is CNA

案例2:多个基类具有,同名不同值的属性或方法

如果多个基类都具有相同的名称,且值各不相同,此时就会出现二义性 此时Pyhton会以基类的继承的排列优先考虑靠前的。

进行多重继承一定要避免这种情况出现

  1. class CNA(Parent): # 基类A
  2. var="this is CNA"
  3. class CNB(Parent): # 基类B
  4. var="this is CNA"
  5. class ClassName(CNA, CNB): # 派生类
  6. def func(self):
  7. print(self.var) # 尝试使用var属性(基类A和B都有的属性)
  8. return None
  9. obj = ClassName()
  10. obj.func()
  1. # 输出
  2. #======================================
  3. this is CNA

QQ截图20210129180614.png


Mixln设计

Mixln不是Python的功能,而是一种”类”的设计模式, Mixln的方式可以规避掉多重继承的一些问题

Mixln的设计流程是这样的: 将功能做成基类。 把需要的功能,通过多重继承的方式封装成派生类。

本质上是把类模块化了


如果我们把类设计这样,当到派生类类时就会出现例如二义性的情况
而且非常不便于阅读

L- 多重继承 - 图3

因此可也考虑把功能作为基类,把需要的功能打包封装成派生类。
这样更有益于阅读,和梳理逻辑
这就是Mixln L- 多重继承 - 图4