Python继承collections.namedtuple报错:TypeError初始化参数问题
解决继承collections.namedtuple子类时的TypeError问题
当尝试继承collections.namedtuple生成的类并自定义__init__方法时,会触发如下报错:
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
问题原因
namedtuple生成的类是tuple的子类,而tuple作为不可变类型,实例的创建与初始化逻辑是在__new__方法中完成的。__init__方法会在实例完全构建后才被调用,此时调用super().__init__()并传递参数,实际上是调用了object.__init__——它仅接受self一个参数,因此触发类型错误。
解决方案
方案1:移除自定义的__init__方法
如果不需要额外初始化逻辑,直接继承namedtuple生成的类即可,父类已经处理了所有字段的初始化:
from collections import namedtuple TransactionTuple = namedtuple( typename="Transactionttt", field_names=[ "transactionDate", "valueDate", "value", "currency", "concept" ], defaults=("",) ) class TransactionClass(TransactionTuple): # 无需自定义__init__,直接继承父类的创建逻辑 pass print(TransactionClass(1,1,1,1,1))
方案2:重写__new__方法实现自定义逻辑
如果需要添加字段验证、数据转换等自定义逻辑,应该重写__new__方法(不可变类型的实例创建入口):
from collections import namedtuple TransactionTuple = namedtuple( typename="Transactionttt", field_names=[ "transactionDate", "valueDate", "value", "currency", "concept" ], defaults=("",) ) class TransactionClass(TransactionTuple): def __new__(cls, transactionDate, valueDate, value, currency, concept): # 示例:添加交易金额的合法性验证 if not isinstance(value, (int, float)) or value <= 0: raise ValueError("交易金额必须是正数") # 调用父类的__new__创建并返回实例 return super().__new__(cls, transactionDate, valueDate, value, currency, concept) # 正常调用 print(TransactionClass(1,1,100,"USD","购物消费")) # 触发验证错误:print(TransactionClass(1,1,-50,"USD","退款"))
内容的提问来源于stack exchange,提问作者Abel Gutiérrez
相关产品推荐
相关产品推荐

