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
相关产品推荐
相关产品推荐

