gpt4 book ai didi

python - 在 Python 中定义具有自动生成的 __init__ 和来自值字典的附加 init2 的数据类的正确方法是什么

转载 作者:行者123 更新时间:2023-11-28 22:10:22 24 4
gpt4 key购买 nike

在 Python 中,我有一个包含十几个成员的数据类。我用它来创建一个字典,然后将其发布到到 ElasticSearch 中。

现在我想从 ElasticSearch 中获取字典 并使用它来初始化数据类。

开始于:

  1. Python 不允许创建具有不同签名的第二个 __ init __。
  2. 我不想手动编写自动生成的 __ init __ 只是为了添加一个可选参数
  3. 我不想添加一个可选参数来接受字典,只是为了让 __ init __ 保持自动生成。

我想添加第二个方法 init2,它将返回数据类的实例并将传递的 dict 参数解析为自动生成的 __ init __ 方法。


我会感谢您的意见,以确定我在下面建议的解决方案是否是正确的实现。

另外,这个实现可以被认为是一种工厂吗?

谢谢。


Follow up: Since the JSON\dictionary I get from the ES request is:

  1. Has exactly the same keywords as the dataclass

  2. Is flat, i.d., there are no nested objects.

I could simply pass the values as a **dict into the the auto-generated __ init __ method.

See my answer below for this specific case:


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)

最佳答案

您的代码中存在潜在错误。考虑一下:

class Thing:
def __init__(self, a, b):
self.a, self.b = a, b

@classmethod
def from_int(cls, value):
return Thing(value, value + 1)

class AnotherOne(Thing):
def __init__(self, a, b):
self.a, self.b = a + 1, b + 2

现在,如果你运行 AnotherOne.from_int(6)你会得到一个Thing对象:

>>> AnotherOne.from_int(6)
<__main__.Thing object at 0x8f4a04c>

...虽然您可能想创建一个 AnotherOne对象!

要解决这个问题,请像这样创建对象:

class Thing:
...

@classmethod
def from_int(cls, value):
return cls(value, value + 1) # Use `cls` instead of `Thing`

我认为您的代码在其他方面还不错:确实,classmethod 的一种用法提供了除使用 __init__ 之外的其他方法来初始化类的实例.

关于python - 在 Python 中定义具有自动生成的 __init__ 和来自值字典的附加 init2 的数据类的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56849331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com