带有@property's to dict 的 Python 对象

Ski*_*927 4 python dictionary object python-2.7

我是 Python 新手,所以请原谅我是否对一些简单的事情感到困惑。

我有一个这样的对象:

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

    @property
    def prop1(self):
        return foo.some_func(self.attr1)
Run Code Online (Sandbox Code Playgroud)

我像这样实例化它:

a = myObject()
a.attr1 = 'Apple'
a.attr2 = 'Banana'
Run Code Online (Sandbox Code Playgroud)

它所包含的方法期望返回 dict,所以我这样做:

return a.__dict__
Run Code Online (Sandbox Code Playgroud)

prop1不包括在退货中。我明白为什么会这样,它不在对象的__dict__因为它只包含真实属性。

所以问题是,我怎样才能返回,返回这样的东西:

{'attr1': 'Apple', 'attr2': 'Banana', 'prop1': 'ModifiedApple'}
Run Code Online (Sandbox Code Playgroud)

除了在返回之前做:

a.prop1_1 = a.prop1
Run Code Online (Sandbox Code Playgroud)

Nic*_*ley 6

你想要的是inspect模块。

a = myObject()
a.attr1 = 'Apple'
a.attr2 = 'Banana'
inspect.getmembers(a)
Run Code Online (Sandbox Code Playgroud)

回报

[('attr1','Apple'),('attr2','Banana'),('prop1','ModifiedApple')...]
Run Code Online (Sandbox Code Playgroud)

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

如果你想把它当作字典,你可以随时使用

dict(inspect.getmembers(a))
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 6

你应该离开__dict__,只将它用于直接存在于实例上的属性。

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

@property
def all_attributes(self):
    return dict(vars(self), prop1=self.prop1)
Run Code Online (Sandbox Code Playgroud)

这可以通过内省自动检测所有属性对象,但要考虑到您使用属性以避免首先进行计算;触发所有属性的计算可能不是那么理想。