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