多重继承
一个类,可以同时继承多个类,这就是派生继承
class CNA(object):
valA ="CNA"
class CNB(object):
valB ="CNB"
class ClassName(CNA, CNB)
def func(self):
print(self.valA)
print(self.valB)
二义性:多重继承引发的问题
在一段程序中其实不允许出现两个相同名称的属性或者方法,如果出现就会带来二义性的问题。 在简单的单一继承中不存在这种问题(要么报错,要么被派生类覆盖) 但是在多重继承,是会引发这种问题(当派生类,继承自两个具有相同属性的基类时,二义性就出现了)
案例1:属性或方法最终是来自同一个基类
假如两个基类的属性或者方法都来自同一个父类, 派生类是不会出现二义性问题
注意:只要属性或方法在继承过程中,任意一个环节被修改,就属于案例2
class Parent(object): # 父类
def func(self):
print("this is Parent")
return None
class CNA(Parent): # 基类A
pass
class CNB(Parent): # 基类B
pass
class ClassName(CNA, CNB) # 派生类
pass
obj = ClassName()
obj.func() # func被CNA、CNB继承,
# 而className的func是来自CNA和CNB,看上去出现了二义性
# 但最终方法func来自同一个父类Parent
# 输出
#======================================
this is CNA
案例2:多个基类具有,同名不同值的属性或方法
如果多个基类都具有相同的名称,且值各不相同,此时就会出现二义性 此时Pyhton会以基类的继承的排列优先考虑靠前的。
进行多重继承一定要避免这种情况出现
class CNA(Parent): # 基类A
var="this is CNA"
class CNB(Parent): # 基类B
var="this is CNA"
class ClassName(CNA, CNB): # 派生类
def func(self):
print(self.var) # 尝试使用var属性(基类A和B都有的属性)
return None
obj = ClassName()
obj.func()
# 输出
#======================================
this is CNA
Mixln设计
Mixln不是Python的功能,而是一种”类”的设计模式, Mixln的方式可以规避掉多重继承的一些问题
Mixln的设计流程是这样的: 将功能做成基类。 把需要的功能,通过多重继承的方式封装成派生类。
本质上是把类模块化了
如果我们把类设计这样,当到派生类类时就会出现例如二义性的情况
而且非常不便于阅读
因此可也考虑把功能作为基类,把需要的功能打包封装成派生类。
这样更有益于阅读,和梳理逻辑
这就是Mixln