2015-04-05 5 views
2

Пусть есть класс с @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.

ответ

4

Просто проверьте тип против property объекта:

if isinstance(MyClass.this_is_a_property, property): 

Вы действительно не должны извлечь его из класса словаря здесь; поиск свойства класса в качестве атрибута также возвращает экземпляр property.

+3

да, хотя это не верный способ проверить это; фактический экземпляр может быть * другим * дескриптором, который просто возвращает 'свойство' при поиске на классе;) (надуманный да) –

3

Вы можете использовать inspect.isdatadescriptor:

возвращающие если объект является дескриптором данных. ... Примерами являются свойства (определенные в Python), getets и members.

...

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 

Недостаток этой функции заключается в том, что он может вернуться, если Trueisinstance(mystery, property) является False.

Лучший способ для проверки типа объекта непосредственно:

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

' property' - * тип * дескриптора данных; любой объект с методами '__get__' и' __set__' будет квалифицироваться; это включает атрибуты, определенные с помощью '__slots__'. –

+0

@MartijnPieters спасибо, я обновил свой ответ. – vaultah

Смежные вопросы