2015-04-01 82 views
0

我是新来的Python,所以请原谅,如果我已经瞥见了一些简单的事情做到这一点。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' 

而且方法这一切都包裹在预计字典的回报,所以我这样做:

return a.__dict__ 

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

所以现在的问题是,怎样才能让我的收益率,这样的事情:

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

以外的回归做对前:

a.prop1_1 = a.prop1 
+3

为什么不在你的类中添加一个新的方法,该方法返回一个'self .__ dict__'的副本并添加了属性值? – 2015-04-01 14:27:59

+0

@MartijnPieters这可能会解决这个特定情况,但不能解决查找任意对象的属性值的一般情况。 – 2015-04-01 14:49:26

+0

@NickBailey:API经常使用属性,因为检索值可能会有些昂贵,并且计算值会被推迟,直到您真正需要它为止。如果你真的需要的话,你可以自动发现类中的所有“属性”对象,但是*一般情况下,如果你不知道它们用于什么,那么捅所有属性并不是一个好主意。 – 2015-04-01 14:51:11

回答

1

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

如果您需要制作具有属性名称和值的字典,这些都包含属性,你可以只添加,产生一个新的dicitonary另一个属性或方法:

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

这可能与内省检测自动化所有属性对象,但考虑到您使用属性来避免必须首先进行计算;触发所有属性的计算可能并不是所有需要的。

1

你想要什么inspect模块。

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

回报

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

注意getmembers也将返回内置成员一样__sizeof__,所以你可能需要一点滤波应用到列表中。

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

dict(inspect.getmembers(a))