Python:获取使用@property注解的类实例的所有属性

4 投票
3 回答
728 浏览
提问于 2025-04-16 19:33

有没有简单的方法可以获取一个类实例中所有使用了@property或者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>
}

另外,有没有办法让它跳过类级别的变量?

3 个回答

1

这样做会得到一个字典,里面包含了一个类实例的所有属性,这些属性是通过@property或者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类里唯一的属性。

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}
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'}

撰写回答