Python动态多继承__init__问题:子类无法初始化父类属性
解决多继承类中仅第一个父类__init__被调用的问题
你碰到的这个AttributeError太典型了——Python在多继承场景下,默认只会按MRO(方法解析顺序)调用第一个匹配到的__init__方法。你用type创建的C类没有自己的构造方法,所以Python只会调用排在最前面的父类A的__init__,父类B的初始化逻辑完全没被执行,自然就没有b属性了。
下面给你几种解决思路,适配你这种动态创建多继承类的插件场景:
1. 显式调用所有父类的__init__(固定父类数量场景)
如果当前确定父类的数量,你可以直接给C定义一个自定义的__init__,手动触发每个父类的构造方法:
class A(object): def __init__(self,s): self.a="a" def testA(self,x): print(x) class B(object): def __init__(self,s): self.b="b" def testA(self,x): print(x) def c_init(self, s): A.__init__(self, s) B.__init__(self, s) # 用type创建类时传入自定义的__init__ C = type('C', (A,B), {'__init__': c_init}) x= C("test") print(x.b) # 现在能正常输出"b"
2. 动态遍历所有父类初始化(适配未知数量的父类)
既然是插件环境,父类数量可能随时变化,那可以通过遍历类的__bases__属性,自动调用每个父类的__init__:
class A(object): def __init__(self,s): self.a="a" def testA(self,x): print(x) class B(object): def __init__(self,s): self.b="b" def testA(self,x): print(x) def dynamic_init(self, s): # 遍历当前类的所有父类,逐个调用它们的__init__ for base in self.__class__.__bases__: base.__init__(self, s) # 不管后续添加多少个父类,这个init都会自动处理 C = type('C', (A,B), {'__init__': dynamic_init}) x= C("test") print(x.b) # 正常输出"b"
⚠️ 注意:这种方式要求所有父类的__init__参数一致(都是接受s参数)。如果不同插件的父类构造方法参数不同,你可能需要额外做参数适配的逻辑,比如通过inspect模块检查父类__init__的参数签名,再动态传递对应参数。
内容的提问来源于stack exchange,提问作者user1763510




