如何将 Python 字典转换为 Class 对象

Ale*_*scu 11 python type-safety

我正在寻找一种简单的方法来直接将 python 字典转换为自定义对象,如下所示,同时不破坏智能感知。结果不应该是只读的,它的行为应该就像一个新对象。

d = {
    "key1": 1,
    "key2": 2
}

class MyObject(object):
    key1 = None
    key2 = None

# convert to object o

# after conversion
# should be able to access the defined props
# should be highlighted by intellisense
print(o.key1)
# conversion back to dict is plain simple
print(o.__dict__)
Run Code Online (Sandbox Code Playgroud)

Adi*_*rio 17

您的对象没有字段,只有类属性。您需要创建一个__init__方法,有些人将其称为构造函数,但它实际上并不是其他语言所理解的构造函数,因此我们避免这样调用它。

class MyObject:
    def __init__(self, d=None):
        if d is not None:
            for key, value in d.items():
                setattr(self, key, value)

d = {
    "key1": 1,
    "key2": 2,
}

o = MyObject(d)
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码将尝试将字典中的所有键值对设置为对象中的字段。一些有效的键(例如)"key.1"将不是有效的字段名称(它实际上会被设置,但您将无法使用 获取它o.key.1)。


AXO*_*AXO 6

我会使用数据类(需要 Python 3.7+):

from dataclasses import dataclass


@dataclass
class MyObject:
    key1: int = None
    key2: int = None


d = {
    "key1": 1,
    "key2": 2,
}

o = MyObject(**d)

print(o)  # MyObject(key1=1, key2=2)
print(vars(o))  # {'key1': 1, 'key2': 2}
Run Code Online (Sandbox Code Playgroud)

dataclass会自动为你生成__repr____eq__ __hash__、 等一些方法。