Python Glossary English

все 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Сообщить о неточности