如何检查变量是否属性

时间:2015-04-05 18:27:54

标签: python python-3.x properties

假设有一个定义了@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功能。

2 个答案:

答案 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__(),则它是一个数据   描述;如果它既不定义,则它是非数据描述符。

非数据描述符包括classmethodstaticmethod(也就是说,它们不是函数,它们是类型)。例如,inspect.isdatadescriptor(MyClass.this_is_a_classmethod)将返回False

另一方面,property 数据描述符:

In [6]: inspect.isdatadescriptor(MyClass.this_is_a_property)
Out[6]: True

使用此功能的缺点是,如果Trueisinstance(mystery, property),则可能会返回False

更好的方法是直接检查对象类型:

In [7]: isinstance(MyClass.this_is_a_property, property)
Out[7]: True