python检查用@property修饰的get方法

python检查用@property修饰的get方法,python,properties,inspect,Python,Properties,Inspect,这是我实际问题的一个简化例子 我在foo.py中定义了一个类foo: class foo(object): def __init__(self): pass def bar(self): return True @property def baz(self): return False import foo import inspect classes = inspect.getmembers(foo, in

这是我实际问题的一个简化例子

我在
foo.py
中定义了一个类
foo

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

    def bar(self):
        return True

    @property
    def baz(self):
        return False
import foo
import inspect

classes = inspect.getmembers(foo, inspect.isclass)
for cls in classes:
    methods = inspect.getmembers(cls[1], inspect.ismethod)
    print methods
现在,我想使用
inspect
模块来获取
foo
类的方法(包括
baz
)。这就是我目前在
getmethods.py
中看到的内容:

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

    def bar(self):
        return True

    @property
    def baz(self):
        return False
import foo
import inspect

classes = inspect.getmembers(foo, inspect.isclass)
for cls in classes:
    methods = inspect.getmembers(cls[1], inspect.ismethod)
    print methods
当我运行此脚本时,我得到以下输出(这并不完全出乎意料):


@property
装饰器生成一个
属性
对象,而不是函数或方法。此对象在访问时(通过)调用存储在该对象上的
.fget
.fset
.fdel
属性中的函数

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

methods = inspect.getmembers(cls[1], inspect.ismethod)
properties = inspect.getmembers(cls[1], lambda o: isinstance(o, property))


请注意,同样的限制也适用于
classmethod
staticmethod
对象。

好的,所以我发布得有点太早了,但我仍然在寻找一个很好的理由,为什么属性不被视为方法,因为代码是在请求属性时执行的。现在我正在做
methods=inspect.getmembers(cls[1],lambda x:inspect.ismethod(x)或isinstance(x,property))
我还想知道是否有更好的方法。回答得很好,忘记了能够将一个元组传递给
isinstance
methods_and_properties = inspect.getmembers(
    cls[1], lambda o: isinstance(o, (property, types.MethodType)))