You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多继承场景下如何避免不同父类的实例变量混淆?

问题根因

你编写的all_vars_Income、all_vars_Expenses方法遍历的是Balance子类实例的所有属性,而多继承场景下子类实例会同时继承两个父类的全部属性,自然会把收入、支出两类字段混合统计。

修复方案

你已经用了dataclass装饰器,可以直接用Python标准库dataclasses模块提供的fields()方法,精准获取指定类自身定义的所有dataclass字段,不会拉取其他父类的属性:

from dataclasses import dataclass, fields # 新增导入fields方法


@dataclass
class Income:

    first_Income: int = 0
    second_Income: int = 0
    third_Income: int = 0

    def all_vars_Income(self):
        # 仅获取Income类自己定义的字段名
        return [field.name for field in fields(Income)]

    def sum_Income(self):
        return sum([getattr(self, var) for var in self.all_vars_Income()])


@dataclass
class Expenses:

    first_Expenses: int = 0
    second_Expenses: int = 0
    third_Expenses: int = 0

    def all_vars_Expenses(self):
        # 仅获取Expenses类自己定义的字段名
        return [field.name for field in fields(Expenses)]

    def sum_Expenses(self):
        return sum([getattr(self, var) for var in self.all_vars_Expenses()])


class Balance(Income, Expenses):
    def sum_Balance(self):
        return self.sum_Income() - self.sum_Expenses()


# 测试代码
user = Balance()
user.first_Income = 50
user.second_Expenses = 100
print(user.sum_Income()) # 输出50
print(user.sum_Expenses()) # 输出100
print(user.sum_Balance()) # 输出-50,符合预期
补充说明

如果不想依赖fields()方法,也可以通过字段名前缀/后缀过滤实现,比如统计Income字段时只保留后缀为_Income的属性,效果完全一致,但不如上述方案简洁规范。

内容的提问来源于stack exchange,提问作者Jeffery-the-newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:21:03