все Python 3inspectфункция
inspect.isdatadescriptor()
дескрипторы
Проверяет, что объект — дескриптор данных: у него есть __set__ или __delete__ (property, слоты __slots__, атрибуты C-типов).
Синтаксис
inspect.isdatadescriptor(object) -> bool
Разница с дескриптором метода решает приоритет: дескриптор данных в классе сильнее записи в __dict__ экземпляра, поэтому property нельзя «перекрыть» присваиванием obj.p = 1 — вызовется сеттер или будет AttributeError. Обычный метод — не дескриптор данных: присваивание a.m = ... просто спрячет его за атрибутом экземпляра. Проверять нужно объект из класса (A.__dict__['p']), а не значение через экземпляр.
Примеры
import inspect
class A:
@property
def p(self):
return 1
def m(self):
return 2
print(inspect.isdatadescriptor(A.__dict__['p'])) # → True
print(inspect.isdatadescriptor(A.__dict__['m'])) # → False
a = A()
a.m = 'спрятан'
print(a.m) # → спрятан
try:
a.p = 5
except AttributeError:
print('property не перекрыть') # → property не перекрыть
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности