在数据类表示中传递参数
Passing arguments in dataclass representation
我下面有一个 NormalClass
,我想将其构造为 dataclass
。但是我不确定如何在 dataclass
中传递没有 __init__
的 date_str
参数。有什么想法吗?
class FieldDateTime():
def __init__(self, data, d_format='%m/%d/%y %I:%M %p'):
try:
self.data = datetime.strptime(data, d_format)
except ValueError as e:
raise ValueError('Dateformat incorrect')
def __call__(self):
return self.data
class NormalClass:
def __init__(self, id, date_str):
self.id: int = id
self.dt: FieldDateTime = FieldDateTime(date_str)
@dataclass
class DataClassObj:
id: int
dt: FieldDateTime(date_str)
如何在没有 init 的情况下将 date_str 作为参数传递给数据 class 表示 (DataClassObj)?
如果我对你的理解正确,你想使用 python dataclasses 来实现 class 实例字段的默认初始化。此功能可用 since Python 3.7,它隐式地将 __init__
构造函数添加到 class,后者使用您指定的默认值初始化 class 实例。
使用它的代码如下所示:
from datetime import datetime
class FieldDateTime():
def __init__(self, data, d_format='%m/%d/%y %I:%M %p'):
try:
self.data = datetime.strptime(data, d_format)
except ValueError as e:
raise ValueError('Dateformat incorrect')
def __str__(self):
return str(self.data)
from dataclasses import dataclass
@dataclass
class NormalDataClass:
id: int = 0 # default id
dt: FieldDateTime = FieldDateTime("02/03/20 05:20 AM") # default date
代码下方
ndc = NormalDataClass()
print(ndc.id)
print(ndc.dt)
打印:
0
2020-02-03 05:20:00
你的问题必须更详细,但我认为这就是你要找的:
from __future__ import annotations
from datetime import datetime
from dataclasses import dataclass, InitVar, field
class FieldDateTime:
def __init__(self, data, d_format='%m/%d/%y %I:%M %p'):
try:
self.data = datetime.strptime(data, d_format)
except ValueError as e:
raise ValueError('Dateformat incorrect')
def __repr__(self):
return f"{self.__class__.__name__}({self.data})"
def __call__(self):
return self.data
@dataclass
class NormalDataClass:
id: int
date_str: InitVar[str]
dt: FieldDateTime = field(init=False)
def __post_init__(self, date_str):
self.dt = FieldDateTime(date_str)
print(NormalDataClass(10, '09/04/21 08:11 PM'))
输出(考虑到 FieldDateTime 上类似数据类的 __repr__
实现,使其看起来更好一点):
NormalDataClass(id=10, dt=FieldDateTime(2021-09-04 20:11:00))
Init-only fields are added as parameters to the generated __init__
method, and are passed to the optional __post_init__
method.
所以我们可以为我们的 date_str
使用 InitVar
并将其传递给 __post_init__
以创建我们的 FieldDateTime
对象。
我下面有一个 NormalClass
,我想将其构造为 dataclass
。但是我不确定如何在 dataclass
中传递没有 __init__
的 date_str
参数。有什么想法吗?
class FieldDateTime():
def __init__(self, data, d_format='%m/%d/%y %I:%M %p'):
try:
self.data = datetime.strptime(data, d_format)
except ValueError as e:
raise ValueError('Dateformat incorrect')
def __call__(self):
return self.data
class NormalClass:
def __init__(self, id, date_str):
self.id: int = id
self.dt: FieldDateTime = FieldDateTime(date_str)
@dataclass
class DataClassObj:
id: int
dt: FieldDateTime(date_str)
如何在没有 init 的情况下将 date_str 作为参数传递给数据 class 表示 (DataClassObj)?
如果我对你的理解正确,你想使用 python dataclasses 来实现 class 实例字段的默认初始化。此功能可用 since Python 3.7,它隐式地将 __init__
构造函数添加到 class,后者使用您指定的默认值初始化 class 实例。
使用它的代码如下所示:
from datetime import datetime
class FieldDateTime():
def __init__(self, data, d_format='%m/%d/%y %I:%M %p'):
try:
self.data = datetime.strptime(data, d_format)
except ValueError as e:
raise ValueError('Dateformat incorrect')
def __str__(self):
return str(self.data)
from dataclasses import dataclass
@dataclass
class NormalDataClass:
id: int = 0 # default id
dt: FieldDateTime = FieldDateTime("02/03/20 05:20 AM") # default date
代码下方
ndc = NormalDataClass()
print(ndc.id)
print(ndc.dt)
打印:
0
2020-02-03 05:20:00
你的问题必须更详细,但我认为这就是你要找的:
from __future__ import annotations
from datetime import datetime
from dataclasses import dataclass, InitVar, field
class FieldDateTime:
def __init__(self, data, d_format='%m/%d/%y %I:%M %p'):
try:
self.data = datetime.strptime(data, d_format)
except ValueError as e:
raise ValueError('Dateformat incorrect')
def __repr__(self):
return f"{self.__class__.__name__}({self.data})"
def __call__(self):
return self.data
@dataclass
class NormalDataClass:
id: int
date_str: InitVar[str]
dt: FieldDateTime = field(init=False)
def __post_init__(self, date_str):
self.dt = FieldDateTime(date_str)
print(NormalDataClass(10, '09/04/21 08:11 PM'))
输出(考虑到 FieldDateTime 上类似数据类的 __repr__
实现,使其看起来更好一点):
NormalDataClass(id=10, dt=FieldDateTime(2021-09-04 20:11:00))
Init-only fields are added as parameters to the generated
__init__
method, and are passed to the optional__post_init__
method.
所以我们可以为我们的 date_str
使用 InitVar
并将其传递给 __post_init__
以创建我们的 FieldDateTime
对象。