Python 带有@property';听写

Python 带有@property';听写,python,python-2.7,object,dictionary,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 = 'Ap

我是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'
{'attr1': 'Apple', 'attr2': 'Banana', 'prop1': 'ModifiedApple'}
我将其实例化如下:

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'
{'attr1': 'Apple', 'attr2': 'Banana', 'prop1': 'ModifiedApple'}
它所包装的方法要求返回dict,所以我这样做:

return a.__dict__
但是
prop1
不包括在报税表中。我理解这是为什么,它不在对象的
\uuuu dict\uuuu
中,因为它只保存真实属性

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

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'
{'attr1': 'Apple', 'attr2': 'Banana', 'prop1': 'ModifiedApple'}
除在返回之前进行以下操作外:

a.prop1_1 = a.prop1

您需要的是
inspect
模块

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

[('attr1','Apple'),('attr2','Banana'),('prop1','ModifiedApple')...]
请注意,getmembers还将返回内置成员,如
\uuuu sizeof\uuuu
,因此您可能需要对列表应用一些筛选

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

dict(inspect.getmembers(a))

您应该将
\uuuu dict\uuuu
保留为be,仅将其用于直接存在于实例上的属性

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

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

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

为什么不在类中添加一个新方法,返回添加属性值的
self.\uu dict\uu
副本?@MartijnPieters,这可能会解决此特定情况,但不能解决为任意对象查找属性值的一般情况。@NickBailey:API经常使用属性,因为检索该值可能会有点昂贵,而计算该值会推迟到实际需要时。如果确实需要,您可以自动发现类上的所有
属性
对象,但通常情况下,如果您不知道所有属性的用途,那么最好不要刺穿它们。某些属性不会出现在实例的
\uuuuuu dict\uuuu
中。但是属性确实出现在类“
”中。看看这个@MartijnPieters。说得对。但是,如果您使用的是已知的类API,那么为什么要使用dict呢?太棒了!我喜欢你溶液的清洁度!如果属性被
@setter
修改怎么办?如果我有
@property def uno(self):return self.\u uno
@uno.setter def uno(self,val):self.\u uno=val*10
您的解决方案将返回
{u uno:100}
而不是
{uno:100}
@leonardvertighel:它返回实例属性映射中的所有键值对,是的。如果您显式添加它,它将返回
uno
,如果您不想显示
\u uno
,则需要显式筛选它:
返回{**{k:v代表k,如果k[:1]!=''u'},'uno':self.uno}
过滤掉以下划线开头的键。过滤从
inspect.getmembers
返回的列表中的属性对于除最简单的类以外的所有类来说可能有点复杂,除非使用特定的约定来命名您要查找的类属性(如对所有属性使用前缀“prop”)。。。