这是我实际问题的简化示例.
我有一个这样foo
定义的类foo.py
:
class foo(object): def __init__(self): pass def bar(self): return True @property def baz(self): return False
现在,我想使用该inspect
模块来获取foo
类的方法(包括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__',), ('bar', )]
所以,我的问题是,为什么baz
不被认为是一种方法,我如何修改getmethods.py
以获得以下输出:
[('__init__',), ('bar', ), ('baz', )]
Martijn Piet.. 12
所述@property
装饰产生property
对象,而不是函数或方法.正是这种对象调用它已存储在功能.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
对象.
所述@property
装饰产生property
对象,而不是函数或方法.正是这种对象调用它已存储在功能.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
对象.