带有@属性的Python对象到dict

时间:2015-04-01 14:24:14

标签: python python-2.7 object dictionary

我是Python的新手,所以请原谅我是否已做过一些简单的事情。

我有一个这样的对象:

class myObject(object):
    def __init__(self):
        self.attr1 = None
        self.attr2 = None

    @property
    def prop1(self):
        return foo.some_func(self.attr1)

我实例化它:

a = myObject()
a.attr1 = 'Apple'
a.attr2 = 'Banana'

它所包含的方法预计会返回dict,所以我这样做:

return a.__dict__

但返回时未包含prop1。我理解为什么会这样,它不在对象的__dict__中,因为它只包含真正的属性。

所以问题是,如何让我回来,返回这样的东西:

{'attr1': 'Apple', 'attr2': 'Banana', 'prop1': 'ModifiedApple'}

除了在返回之前做的事情:

a.prop1_1 = a.prop1

2 个答案:

答案 0 :(得分:3)

你想要的是inspect模块。

a = myObject()
a.attr1 = 'Apple'
a.attr2 = 'Banana'
inspect.getmembers(a)

返回

[('attr1','Apple'),('attr2','Banana'),('prop1','ModifiedApple')...]

请注意,getmembers还会返回内置成员,例如__sizeof__,因此您可能需要对列表应用一些过滤。

如果您希望它作为字典,您可以随时使用

dict(inspect.getmembers(a))

答案 1 :(得分:3)

您应该离开__dict__,仅将其用于直接存在于实例上的属性。

如果您需要生成包含属性名称和包含该属性的值的字典,您可以添加另一个产生新dicitonary的属性或方法:

@property
def all_attributes(self):
    return dict(vars(self), prop1=self.prop1)

这可以通过内省自动检测所有属性对象,但要考虑到您使用属性以避免必须首先进行预先计算;触发所有属性的计算可能并非完全可取。