python 检查用 @属性 装饰的 get 方法
python inspect get methods decorated with @property
这是我的实际问题的简化示例。
我有一个 class foo
在 foo.py
中这样定义:
class foo(object):
def __init__(self):
pass
def bar(self):
return True
@property
def baz(self):
return False
现在,我想使用inspect
模块获取foo
class(包括baz
)的方法。这是我目前在 getmethods.py
:
中的内容
import foo
import inspect
classes = inspect.getmembers(foo, inspect.isclass)
for cls in classes:
methods = inspect.getmembers(cls[1], inspect.ismethod)
print methods
当我 运行 这个脚本时,我得到以下输出(这并不完全出乎意料):
[('__init__', <unbound method foo.__init__>), ('bar', <unbound method foo.bar>)]
所以,我的问题是,为什么 baz
不被视为一种方法,我如何修改 getmethods.py
以获得以下输出:
[('__init__', <unbound method foo.__init__>), ('bar', <unbound method foo.bar>), ('baz', <property object at 0x7fbc1a73d260>)]
@property
装饰器生成一个 property
对象,而不是函数或方法。正是这个对象在访问时(通过 descriptor protocol)调用存储在该对象的 .fget
、.fset
和 .fdel
属性中的函数。
您必须显式测试该对象类型:
methods = inspect.getmembers(cls[1], inspect.ismethod)
properties = inspect.getmembers(cls[1], lambda o: isinstance(o, property))
或
methods_and_properties = inspect.getmembers(
cls[1], lambda o: isinstance(o, (property, types.MethodType)))
请注意,相同的限制适用于 classmethod
和 staticmethod
对象。
这是我的实际问题的简化示例。
我有一个 class foo
在 foo.py
中这样定义:
class foo(object):
def __init__(self):
pass
def bar(self):
return True
@property
def baz(self):
return False
现在,我想使用inspect
模块获取foo
class(包括baz
)的方法。这是我目前在 getmethods.py
:
import foo
import inspect
classes = inspect.getmembers(foo, inspect.isclass)
for cls in classes:
methods = inspect.getmembers(cls[1], inspect.ismethod)
print methods
当我 运行 这个脚本时,我得到以下输出(这并不完全出乎意料):
[('__init__', <unbound method foo.__init__>), ('bar', <unbound method foo.bar>)]
所以,我的问题是,为什么 baz
不被视为一种方法,我如何修改 getmethods.py
以获得以下输出:
[('__init__', <unbound method foo.__init__>), ('bar', <unbound method foo.bar>), ('baz', <property object at 0x7fbc1a73d260>)]
@property
装饰器生成一个 property
对象,而不是函数或方法。正是这个对象在访问时(通过 descriptor protocol)调用存储在该对象的 .fget
、.fset
和 .fdel
属性中的函数。
您必须显式测试该对象类型:
methods = inspect.getmembers(cls[1], inspect.ismethod)
properties = inspect.getmembers(cls[1], lambda o: isinstance(o, property))
或
methods_and_properties = inspect.getmembers(
cls[1], lambda o: isinstance(o, (property, types.MethodType)))
请注意,相同的限制适用于 classmethod
和 staticmethod
对象。