为什么我不能在列表中的对象上调用__dict__,该列表恰好位于字典中列表中的另一个对象内?

时间:2015-06-10 20:53:44

标签: python json object dictionary

以下是我的设置:dictD包含与值= users配对的密钥list of UserObjects。每个UserObject都有一个属性用户名加上两个数组,线程和注释。

我能够通过此调用将dictD的用户对象数组转换为字典样式:

dictD["users"] = [user.__dict__ for user in dictD["users"]]

如果我倾倒dictD,在我尝试进行操作之前,这里是相关的部分:

{
    'users':[
    {
        'username': Redditor(user_name='$$$$$$$$$$'),
        'threads':[
            <__main__.redditThread instance at 0x7f05db28b320>
        ],
    'comments':[
        <__main__.comment instance at 0x7f05db278e60>
    ]
},
{
    'username': Redditor(user_name='##########e\ gone'),
    'threads':[
        <__main__.redditThread instance at 0x7f05db2a4a70>
    ],
    'comments':[
        <__main__.comment instance at 0x7f05db298e18>
    ]
}

正如您所看到的,注释包含comment个对象,而线程列表包含thread个对象。所以我想为users数组做同样的调用。但是当我尝试这样做时:

for user in dictD["users"]:
    user.threads = [thread.__dict__ for thread in user.threads]
    user.comments = [comment.__dict__ for comment in user.comments]

我遇到了这个错误:

AttributeError: 'dict' object has no attribute 'threads'

我也试过

users = dictD["users"]
for user in users...

但是这会触发相同的错误消息。当这些对象出现时,如何将列表中的对象转换为字典形式?列表本身是否保存在字典中的列表中的对象中?

顺便说一句,我正在做这一切,所以我可以将这些对象插入到MongoDB中,所以如果有更简单的方法来序列化复杂的对象,请让我进入秘密。谢谢。

1 个答案:

答案 0 :(得分:1)

将我的评论提升为答案,因为它似乎是合理的而且没有其他人发帖:它看起来像是在混淆Python for Javascript:带有键'thread'的字典不是你可以用{引用的对象} {1}},仅限.threads。即。 ["threads"]应为user.threads。 dict通常只有相同的标准属性(请参阅:{3}}或{3}}用于Python 3.)问题不是你试图在一个对象上调用user["threads"],它是你试图从一个不存在的对象中获取一个属性,稍后在同一行代码中。

如果要从MongoDB重新创建复杂对象而不仅仅是嵌套的dicts和列表,那么这基本上就是反序列化的过程;您可以手动处理,也可以使用某种对象映射库为您执行此操作(例如https://docs.python.org/2/library/stdtypes.html#typesmapping之类的东西可能有效,但我自己没有测试过它)