Python Dataclass子类实例化为何未提示父类必填参数?
为什么Python 3.9 dataclass子类实例化只提示自身字段缺失?
问题原因
在Python 3.9的@dataclass实现中,子类自动生成的__init__方法只会把子类新增的字段作为必填参数,父类的字段不会被自动加入子类__init__的参数列表。
当你调用Student()时,首先会校验子类__init__的参数——它要求传入grade和subjects,但你没传,所以直接抛出TypeError提示这两个参数缺失。此时代码还没执行到子类__init__内部调用父类__init__的步骤,父类name、city、age缺失的问题根本没机会暴露。
解决方案
要让子类实例化时要求传入所有必填字段(包括父类的),可以用以下两种方式:
方式1:手动编写子类的__init__
from dataclasses import dataclass @dataclass class Person: name: str city: str age: int @dataclass(init=False) # 禁用自动生成的__init__ class Student(Person): grade: int subjects: list def __init__(self, name: str, city: str, age: int, grade: int, subjects: list): super().__init__(name, city, age) self.grade = grade self.subjects = subjects
方式2(更简便):升级到Python 3.10+
Python 3.10及以上版本的@dataclass优化了继承逻辑,子类自动生成的__init__会包含父类的所有非默认字段。升级后运行原有代码,调用Student()时会直接提示缺失所有5个必填参数:
TypeError: __init__() missing 5 required positional arguments: 'name', 'city', 'age', 'grade', and 'subjects'
内容的提问来源于stack exchange,提问作者FaCoffee
相关产品推荐
相关产品推荐

