Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Python dict转换为类对象_Python_Type Safety - Fatal编程技术网

如何将Python dict转换为类对象

如何将Python dict转换为类对象,python,type-safety,Python,Type Safety,我正在寻找一种简单的方法来直接将python dict转换为自定义对象,如下所示,同时不破坏intellisense。结果不应该是只读的,它应该像一个新对象一样工作 d = { "key1": 1, "key2": 2 } class MyObject(object): key1 = None key2 = None # convert to object o # after conversion # should be able to access the

我正在寻找一种简单的方法来直接将python dict转换为自定义对象,如下所示,同时不破坏intellisense。结果不应该是只读的,它应该像一个新对象一样工作

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__)

您可以尝试使用

您可以尝试使用

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

类MyObject:
定义初始化(self,d=None):
如果d不是无:
对于键,d.items()中的值:
setattr(自身、键、值)
d={
“关键1”:1,
“关键2”:2,
}
o=对象(d)

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

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

类MyObject:
定义初始化(self,d=None):
如果d不是无:
对于键,d.items()中的值:
setattr(自身、键、值)
d={
“关键1”:1,
“关键2”:2,
}
o=对象(d)
注意:上面的代码将尝试将dict中的所有键值对设置为对象中的字段。一些有效的键(如
“key.1”
)将不是有效的字段名(实际上会设置它,但您将无法使用
o.key.1
)获取它)

这才是你真正需要的东西


这就是您实际需要的东西。

对于键,d中的值。items():setattr(o,键,值)
对于键,d中的值。items():setattr(o,键,值)
谢谢,这是一个干净的解决方案!只是它需要创建一个像这样的新对象,
o=MyObject({})
,这不是什么大问题,但可以避免吗?当然,我更新的答案满足您的要求吗
o=MyObject()
现在应该可以正常工作了。@AlexPredescu在调用
setattr
之前,您可能需要在循环内部执行一些键检查,以查找不需要的字符(例如
)。如果性能和内存使用是一个重要因素,了解DICT将拥有的密钥将允许使用
\uuuuu插槽。\uuuuu
。谢谢,这是一个干净的解决方案!只是它需要创建一个像这样的新对象,
o=MyObject({})
,这不是什么大问题,但可以避免吗?当然,我更新的答案满足您的要求吗
o=MyObject()
现在应该可以正常工作了。@AlexPredescu在调用
setattr
之前,您可能需要在循环内部执行一些键检查,以查找不需要的字符(例如
)。如果性能和内存使用是一个重要的因素,那么知道DICTS的密钥将允许使用<代码> SysStulsSux。请考虑解释您的解决方案以及为什么它会解决这个问题。请考虑解释您的解决方案,为什么它会解决这个问题。
dict_ = {"User" :{"Name" : "SQWiperYT", "ID" : 10, "Other" : {"ID" : 1}}}
import json


class OurObject:
    def __init__(self, /, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(self, other):
        return self.__dict__ == other.__dict__
      
      
x = json.dumps(dict_)
y = json.loads(x, object_hook=lambda d: OurObject(**d))

# See How it Works
y.User
>>> OurObject(ID=10, Name='SQWiperYT', Other=OurObject(ID=1))
y.User.ID
>>> 10
y.User.Name
>>> 'SQWiperYT'
y.User.Other.ID
>>> 1