Python dataclass不自定义__init__时如何传入date_str参数初始化
实现方案
核心使用Python标准库dataclass提供的InitVar类型标记临时初始化参数,配合__post_init__钩子完成字段的转换逻辑,全程不需要手动编写__init__方法,完全保留dataclass自动生成构造方法的特性。
完整可运行代码
from dataclasses import dataclass, field, InitVar import datetime class FieldDateTime(): def __init__(self, data, d_format='%m/%d/%y %I:%M %p'): try: self.data = datetime.datetime.strptime(data, d_format) except ValueError as e: raise ValueError('Dateformat incorrect') def __call__(self): return self.data @dataclass class DataClassObj: id: int # 标记为仅初始化参数,不会成为实例的普通字段,只会传入__post_init__ date_str: InitVar[str] # init=False表示这个字段不加入自动生成的__init__参数列表,由我们自己赋值 dt: FieldDateTime = field(init=False) def __post_init__(self, date_str): # 构造逻辑和你原来NormalClass里的逻辑完全一致 self.dt = FieldDateTime(date_str)
使用示例
# 直接传入id和date_str即可完成初始化,和原来NormalClass的调用方式完全相同 obj = DataClassObj(id=123, date_str="05/20/24 02:30 PM") print(obj.id) # 输出 123 print(obj.dt()) # 输出 2024-05-20 14:30:00
方案说明
- 你原来写法的错误在于:类型标注位置不能写
FieldDateTime(date_str)这种执行逻辑,dataclass只会读取字段的类型信息生成构造参数,不会执行你写在这里的构造语句。 InitVar是dataclass专门用来实现初始化临时参数的语法,所有标记为InitVar的参数都会被自动加入构造方法的参数列表,并且传入__post_init__方法供你做自定义转换。- 全程没有手动重写
__init__,完全使用dataclass的自动生成逻辑,符合你的需求。
内容的提问来源于stack exchange,提问作者Venu Family
相关产品推荐
相关产品推荐

