📜  python嵌套对象到dict (1)

📅  最后修改于: 2023-12-03 15:04:39.229000             🧑  作者: Mango

Python嵌套对象到字典

在Python中,可以将嵌套对象转换成字典。这种操作需要在多种情况中进行,比如说将Python对象序列化成JSON或短信传输格式。本文将讨论如何将嵌套对象转换为字典。

Python数据类型

在Python中,有五种内置的数据类型:

  • 数字类型(int, float, complex)
  • 布尔类型(bool)
  • 序列类型(list, tuple, range)
  • 映射类型(dict)
  • 集合类型(set, frozenset)

其中,映射类型是我们将要使用的数据类型。

将Python嵌套对象转换为字典

以下是将嵌套对象转换为字典的一般方法:

def nested_to_dict(obj):
    if isinstance(obj, dict):
        return {k: nested_to_dict(v) for k, v in obj.items()}
    elif isinstance(obj, (list, tuple)):
        return [nested_to_dict(item) for item in obj]
    elif hasattr(obj, '__dict__'):
        return nested_to_dict(obj.__dict__)
    else:
        return obj

接下来我们对以上代码进行解析:

  • 判断传入对象是不是字典类型。

如果是字典类型,我们将原字典中的每个键/值对传递给nested_to_dict()进行递归处理,并返回一个新字典。

if isinstance(obj, dict):
    return {k: nested_to_dict(v) for k, v in obj.items()}
  • 判断传入对象是不是序列类型。

如果是序列类型,我们将新序列中的每个元素进行转换,并返回一个新序列。

elif isinstance(obj, (list, tuple)):
    return [nested_to_dict(item) for item in obj]
  • 判断传入对象是否拥有__dict__属性。

如果传入对象是自定义类型的实例,那么它可能有一个__dict__属性,用于存储其属性。我们将递归处理这个__dict__属性。

elif hasattr(obj, '__dict__'):
    return nested_to_dict(obj.__dict__)
  • 没有返回的对象。

否则,则将传入对象原样返回。

else:
        return obj
示例

假设我们有一个名为Person的类:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.father = None
        self.mother = None

现在我们将创建两个人物对象,并将一个人物的Father和Mother属性设置为另一个对象:

father = Person('John', 50)
mother = Person('Jane', 50)

son = Person('Jim', 25)
son.father = father
son.mother = mother

现在我们将Jim对象转换为字典,并将其打印出来:

import pprint

pprint.pprint(nested_to_dict(son))

输出:

{'age': 25,
 'father': {'age': 50, 'father': None, 'mother': None, 'name': 'John'},
 'mother': {'age': 50, 'father': None, 'mother': None, 'name': 'Jane'},
 'name': 'Jim'}
结论

以上就是将Python嵌套对象转换为字典的方法。通过递归字典中的所有键/值对,我们可以将任何嵌套对象转换为字典。这些转换可以让我们更轻松地序列化或转移对象数据。