You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动