8

在Python 模块的文档中attrs 指出,有一种方法可以将属性的类转换为字典表示:

例子:

>>> @attr.s
... class Coordinates(object):
...     x = attr.ib()
...     y = attr.ib()
...
>>> attr.asdict(Coordinates(x=1, y=2))
{'x': 1, 'y': 2}

我怎样才能达到相反的效果:Coordinates从其有效的字典表示中获取实例,而无需样板和attrs模块的乐趣?

4

3 回答 3

10

显然就像在相应的类实例化中使用字典解包(双星)运算符一样简单。attrs

例子:

>>> Coordinates(**{'x': 1, 'y': 2})
Coordinates(x=1, y=2)
于 2017-06-29T08:01:44.217 回答
7

作为更通用的解决方案,它适用于 attrs 嵌套类、枚举或任何其他类型的注释结构,您可以使用https://github.com/Tinche/cattrs

例子:

import attr, cattr

@attr.s(slots=True, frozen=True)  # It works with normal classes too.
class C:
        a = attr.ib()
        b = attr.ib()

instance = C(1, 'a')
cattr.unstructure(instance)
# {'a': 1, 'b': 'a'}
cattr.structure({'a': 1, 'b': 'a'}, C)
# C(a=1, b='a')
于 2019-03-15T06:20:19.237 回答
2

我在我的网络应用程序中执行此操作,以便能够序列化/反序列化为 JSON:

首先,我在我的类上创建了一个方法,该方法返回一个更易于序列化的版本:

def asdict(self, serializable=True):
    if serializable:
        as_dict['type'] = self.__class__.__name__
        return as_dict
    else:
        return attr.asdict(self)

然后,当我需要将这些字典之一(实际上是 JSON 对象)转换回类实例时:

obj_type = values.pop('type')
if obj_type in obj_list:
    obj = getattr(sys.modules[__name__], obj_type)(**values)
于 2017-10-20T03:40:57.637 回答