假设有一个定义了@property
的类:
class MyClass:
...
@property
def this_is_a_property(self):
return self.some_thing
...
def this_is_a_function(self, x):
...
return other_thing
通常,要检查属性是否为函数,我可以使用isfunction
模块中的inspect
。
import inspect
if inspect.isfunction(MyClass.__dict__['this_is_a_function']):
print('this_is_a_function',' is a function')
如何查看property
?似乎没有inspect.isproperty
功能。
答案 0 :(得分:6)
只需根据property
对象检查类型:
if isinstance(MyClass.this_is_a_property, property):
你真的不必在这里从类字典中检索它;在类上查找属性作为属性也会返回property
实例。
答案 1 :(得分:3)
您可以使用inspect.isdatadescriptor
:
如果对象是数据描述符,则返回true。 ......例子是 属性(在Python中定义),getsets和成员。
...
CPython实现细节: getsets是扩展模块中通过PyGetSetDef结构定义的属性。
...
CPython实现细节:成员描述符是通过PyMemberDef结构在扩展模块中定义的属性
数据描述符只是具有某些方法的类型。见3.3.2.1. Implementing Descriptors:
如果描述符定义了
__set__()
和/或__delete__()
,则它是一个数据 描述;如果它既不定义,则它是非数据描述符。
非数据描述符包括classmethod
和staticmethod
(也就是说,它们不是函数,它们是类型)。例如,inspect.isdatadescriptor(MyClass.this_is_a_classmethod)
将返回False
。
另一方面,property
是数据描述符:
In [6]: inspect.isdatadescriptor(MyClass.this_is_a_property)
Out[6]: True
使用此功能的缺点是,如果True
为isinstance(mystery, property)
,则可能会返回False
。
更好的方法是直接检查对象类型:
In [7]: isinstance(MyClass.this_is_a_property, property)
Out[7]: True