是否有一种简单的方法可以检索使用@property或属性方法的类实例的所有属性?
我见过使用vars的示例,但这不适用于类:
class Test(object):
CONSTANT='SKIP ME'
def __init__(self):
self.my = "my"
self.__wrapper = {Test.CONSTANT : "wrapped value"}
@property
def wrapped_value(self):
return self.__wrapper[Test.CONSTANT]
所需的输出是带键/值的字典。
dict = {"my": "my",
"wrapped_value": "wrapped value",
"__wrapper" : <dict>
}
另外还有一种方法可以让它跳过类级变量吗?
答案 0 :(得分:4)
一个简单的解决方案是:
instance = Test()
dict((p, getattr(instance, p))
for p in dir(instance)
if p not in dir(Test) or isinstance(getattr(Test, p), property))
它产生:
{'_Test__wrapper': {'SKIP ME': 'wrapped value'}, 'wrapped_value': 'wrapped value', 'my': 'my'}
答案 1 :(得分:4)
property
是一个班级。只需测试类成员,看看它们是否是它的实例。
>>> class Foo(object):
... @property
... def bar(self):
... return self._bar
...
>>> [x for x in Foo.__dict__ if isinstance(Foo.__dict__[x], property)]
['bar']
>>> foo = Foo()
>>> [x for x in foo.__class__.__dict__ if isinstance(foo.__class__.__dict__[x], property)]
['bar']
>>> dict((x, getattr(foo, x)) for x in foo.__class__.__dict__ if isinstance(foo.__class__.__dict__[x], property))
{'bar': 42}
答案 2 :(得分:1)
这将生成一个使用@property或属性方法的类实例的所有属性的字典。它与其他人所说的相似。
a = Test()
propdict = {} # or propdict = dict()
for attrname in dir(a.__class__):
if isinstance(getattr(a.__class__, attrname), property):
propdict[attrname] = getattr(a, attrname)
然后propdict
将是{'wrapped_value': 'wrapped value'}
,因为wrapped_value
是Test
类的唯一属性。