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)))