python inspect get方法用@property修饰

iLo*_*Tux 11 python properties inspect

这是我实际问题的简化示例.

我有一个这样foo定义的类foo.py:

class foo(object):
    def __init__(self):
        pass

    def bar(self):
        return True

    @property
    def baz(self):
        return False
Run Code Online (Sandbox Code Playgroud)

现在,我想使用该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
Run Code Online (Sandbox Code Playgroud)

当我运行此脚本时,我得到以下输出(这并非完全出乎意料):

[('__init__', <unbound method foo.__init__>), ('bar', <unbound method foo.bar>)]
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,为什么baz不被认为是一种方法,我如何修改getmethods.py以获得以下输出:

[('__init__', <unbound method foo.__init__>), ('bar', <unbound method foo.bar>), ('baz', <property object at 0x7fbc1a73d260>)]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 12

所述@property装饰产生property对象,而不是函数或方法.正是这种对象调用它已存储在功能.fget,.fset.fdel(通过访问时在该对象上的属性描述符协议).

您必须显式测试该对象类型:

methods = inspect.getmembers(cls[1], inspect.ismethod)
properties = inspect.getmembers(cls[1], lambda o: isinstance(o, property))
Run Code Online (Sandbox Code Playgroud)

要么

methods_and_properties = inspect.getmembers(
    cls[1], lambda o: isinstance(o, (property, types.MethodType)))
Run Code Online (Sandbox Code Playgroud)

请注意,相同的限制适用于classmethodstaticmethod对象.