Python多继承中obj.a返回2而非4?执行逻辑疑问
为什么D实例的obj.a返回2而不是4?
问题出在你显式调用父类构造函数的顺序,而非继承关系的MRO(方法解析顺序)。
看D类的__init__方法:
def __init__(self): C.__init__(self) B.__init__(self) self.d = 6
你先调用C.__init__(self),此时self.a被设为4,但紧接着又调用了B.__init__(self),而B的构造函数逻辑是:
def __init__(self): A.__init__(self) # 将self.a设为1 self.a = 2 # 覆盖self.a为2 self.b = 3
B的构造函数执行时,会先调用A的构造函数给self.a赋值1,随后自己再将self.a改成2——这直接覆盖了之前C构造函数设置的self.a=4,所以最终obj.a的值是2。
需要区分两个关键概念:
- MRO(方法解析顺序):Python用来查找子类未定义的方法时的搜索顺序,比如若D未定义
y(),会优先调用C的y(),再找B的y()。 - 实例属性的赋值逻辑:实例属性的值由最后一次赋值操作决定,这里你在D的构造函数里先让C给
self.a赋值,再让B赋值,后面的操作自然覆盖了前面的结果。
如果想让obj.a取C的4,可以调整D构造函数的调用顺序,把B.__init__(self)放在C.__init__(self)之前,或者修改B的构造函数,避免覆盖self.a的值。
内容的提问来源于stack exchange,提问作者Jacky Z
相关产品推荐
相关产品推荐

