【问题标题】:Enumerate Python class properties (not functions)枚举 Python 类属性(不是函数)
【发布时间】:2014-02-22 22:22:10
【问题描述】:

如何枚举标有@property 的 Python 类的函数?

class MyClass:
    @property
    def my_property():
        pass

类似这样,但没有inspect.isproperty 的 lambda 过滤器:

properties = inspect.getmembers(obj, inspect.isproperty)

显然,这些被称为托管属性。

【问题讨论】:

  • Python 2.x 还是 3.x? (可能没有区别,但最好指定)

标签: python python-2.7 properties attributes enumerate


【解决方案1】:

这样就可以了:

inspect.getmembers(obj.__class__, lambda x: isinstance(x, property))

它是这样工作的(使用 IPython):

In [29]: class Foo(object):
   ....:     @property
   ....:     def foo(self): return 42
   ....:     

In [30]: obj = Foo()

In [31]: inspect.getmembers(obj.__class__, lambda prop: isinstance(prop, property))
Out[31]: [('foo', <property at 0x106aec6d8>)]

这是因为property 确实是一个普通的(新型)类;通过使用@property 标记某些内容,您只是在创建property 的一个实例。这也意味着可以使用 isinstance 将属性实例(在类上)与 property 进行类型比较。

【讨论】:

  • 你也可以使用dir,那么你就不需要导入inspect [isinstance(getattr(obj.__class__,prop),property) for prop in dir(obj.__class__)] 已编辑,感谢@Erik
  • 首先,它必须是 dir(obj.__class__),...但是 IIRC,我在某处读到 dir 不应该用于实际代码,而仅用于调试/开发,但我可能错了。
  • inspect 模块已经使用 dir 进行自省:S inspect.py 第 247 到 251 行
  • 好的,不知道 :)
  • 我也不是,只是对您的评论感到好奇:P 很高兴知道这一点
猜你喜欢
  • 2016-01-05
  • 1970-01-01
  • 2017-08-13
  • 2012-09-22
  • 2017-04-23
  • 2014-08-30
  • 2011-02-16
  • 2019-03-08
  • 1970-01-01
相关资源
最近更新 更多