在 Python 中,我有一个包含十几个成员的数据类。我用它来创建一个我发布到 ElasticSearch的字典。
现在我想从 ElasticSearch中获取一个 dict并用它来初始化数据类。
自从:
- Python 不允许创建具有不同签名的第二个 __ init __。
- 我不想手动编写自动生成的 __ init __ 只是为了添加一个可选参数
- 我不想添加一个可选参数来接受字典,只是为了让 __ init __ 保持自动生成。
我想添加第二个方法init2,它将返回数据类的实例并将传递的 dict 参数解析为自动生成的 __ init __ 方法。
我会根据您的意见来决定我下面建议的解决方案是否是正确的实现。
另外,这个实现可以被认为是一种工厂吗?
谢谢。
跟进:由于我从 ES 请求中得到的 JSON\dictionary 是:
具有与数据类完全相同的关键字
是flat,id,没有嵌套对象。
我可以简单地将值作为 **dict 传递给自动生成的 __ init __ 方法。
对于这种特定情况,请参阅下面的答案:
from dataclasses import dataclass
@dataclass
class MyData:
name: str
age: int = 17
@classmethod
def init_from_dict(cls, values_in_dict: dict):
# Original line using MyData was fixed to use cls, following @ForceBru 's comment
# return MyData(values_in_dict['name'], age=values_in_dict['age'])
return cls(values_in_dict['name'], age=values_in_dict['age'])
my_data_1: MyData = MyData('Alice')
print(my_data_1)
my_data_2: MyData = MyData('Bob', 15)
print(my_data_2)
values_in_dict_3: dict = {
'name': 'Carol',
'age': 20
}
my_data_3: MyData = MyData.init_from_dict(values_in_dict_3)
print(my_data_3)
# Another init which uses the auto-generated __init__ works in this specific
# case because the values' dict is flat and the keywords are the same as the
# parameter names in the dataclass.
# This allows me to do this
my_data_4: MyData = MyData(**values_in_dict_3)