我是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
答案 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)
这可以通过内省自动检测所有属性对象,但要考虑到您使用属性以避免必须首先进行预先计算;触发所有属性的计算可能并非完全可取。