__post_init __用于多个继承的数据类

问题描述

试图评估数据类是否适合即将到来的项目,但现在我受此代码困扰:

from dataclasses import dataclass

@dataclass
class MixinA:
    attrA: int
    def __post_init__(self):
        print('MixinA post_init')
        self.attrA = [self.attrA]

@dataclass
class MixinB:
    attrB: str
    def __post_init__(self):
        print('MixinB post_init')
        self.attrB = [self.attrB]

@dataclass
class MixinC:
    attrC: bool
    def __post_init__(self):
        print('MixinC post_init')
        self.attrC = [self.attrC]

@dataclass
class Inherited(MixinC,MixinB,MixinA):
    pass

obj = Inherited(4,'Hello',False)
print(obj.attrA,obj.attrB,obj.attrC)
print(obj.__class__.mro())

令我惊讶的是,当我期望所有三个基类都被调用时,仅调用第一个基类中的__post_init__()

MixinC post_init
4 Hello [False]
[<class '__main__.Inherited'>,<class '__main__.MixinC'>,<class '__main__.MixinB'>,<class '__main__.MixinA'>,<class 'object'>]

此外,改变继承对我没有任何好处。继承后将产生与上面完全相同的输出:

class MixinA:
class MixinB(MixinA):
class MixinC(MixinB):
class Inherited(MixinC):

我是用错误的方式编写测试代码,还是当前行为是出于疏忽或故意?

对我来说,核心问题是,我想在生成最终的数据类实例之前转换每个属性。实际的继承规模更大,并且在每个类中进行继承都是非常多余的。

如果__post_init__()不可行,是否有其他替代方法(例如InitVar或自定义__init__())?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...