Python数据类多重继承报错:初始化缺参的原因与解决
问题分析与修复:调用OrdersTrail.record_diffs时触发TypeError
问题背景
我实现了用于记录对象变更并存储到数据库的BaseTrail数据类,又通过多重继承实现OrdersTrail类以追踪订单变更。调用OrdersTrail.record_diffs方法时触发TypeError,提示缺少10个必要位置参数。
相关代码
from dataclasses import dataclass from typing import Optional, Serializable from datetime import datetime from decimal import Decimal @dataclass class BaseTrail(Serializable): field_name: Optional[str] old_value: Optional[Serializable] new_value: Optional[Serializable] table_name: str # ...省略其他代码 @dataclass class OrdersTrail(BaseTrail, Serializable): customer_id: int order_id: int updated_order_status: Optional[str] created_by: Optional[int] created_on: Optional[datetime] current_all_time_owed: Decimal action: Optional[str] table_name: str order_trail_id: Optional[int] = None # ...省略其他代码 OrdersTrail.record_diffs( conn=connection, current_user=current_user, customer_id=order.customer_id, order_id=order.order_id, updated_order_status=order.order_status, old_value=customer_order, new_value=order, action=update_order.__name__, current_all_time_owed=totals.all_time_owed )
报错信息
TypeError: __init__() missing 10 required positional arguments: 'field_name', 'old_value', 'new_value', 'customer_id', 'order_id', 'updated_order_status', 'created_by', 'created_on', 'current_all_time_owed', and 'action'
报错原因
- 多重继承冗余导致字段冲突:
BaseTrail已经继承了Serializable,OrdersTrail再次继承该类会打乱dataclass的字段合并逻辑;同时table_name在BaseTrail和OrdersTrail中重复定义,进一步导致构造函数参数识别混乱。 - 缺失必填参数:调用
record_diffs时,没有传入field_name、created_by、created_on和table_name这些无默认值的必填字段。 - 类方法参数传递逻辑问题:
record_diffs作为类方法,内部创建OrdersTrail实例时,可能没有正确收集并传递所有必要参数(包括父类BaseTrail的字段)给构造函数。
修复方案
1. 修正多重继承定义
去掉OrdersTrail中重复的Serializable继承,同时删除重复的table_name字段(直接继承自BaseTrail):
@dataclass class OrdersTrail(BaseTrail): # 移除冗余的Serializable继承 customer_id: int order_id: int updated_order_status: Optional[str] created_by: Optional[int] created_on: Optional[datetime] current_all_time_owed: Decimal action: Optional[str] order_trail_id: Optional[int] = None # ...省略其他代码
2. 补充所有必填参数
调用record_diffs时,传入所有缺失的必填字段:
OrdersTrail.record_diffs( conn=connection, current_user=current_user, # BaseTrail必填字段 field_name="order_status", # 填写实际变更的字段名,全量变更可设为None table_name="orders", # 订单表的实际表名 old_value=customer_order, new_value=order, # OrdersTrail必填字段 customer_id=order.customer_id, order_id=order.order_id, updated_order_status=order.order_status, created_by=current_user.id, # 从当前用户获取创建者ID created_on=datetime.now(), # 设置当前时间为记录创建时间 action=update_order.__name__, current_all_time_owed=totals.all_time_owed )
3. 检查record_diffs方法实现
确保record_diffs类方法能正确传递参数给构造函数,示例实现如下:
@classmethod def record_diffs(cls, conn, current_user, **kwargs): # 可在此处补充默认参数逻辑,比如自动设置created_on if "created_on" not in kwargs: kwargs["created_on"] = datetime.now() # 创建OrdersTrail实例 trail_instance = cls(**kwargs) # 将实例写入数据库的逻辑 # ...
内容的提问来源于stack exchange,提问作者hazker
相关产品推荐
相关产品推荐

