Атрибут объекта, доступ к которому подчиняется протоколу дескриптора.
Для реализации дескриптора классу требуется определить один или несколько методов, входящих в протокол дескриптора:


По умолчанию при получении значения, установке значения или удалении атрибута мы оперируем словарём объекта (и далее класса и его родителей). Иногда в ходе описанных операций может понадобиться дополнительная логика — для этого и существуют дескрипторы.

Существуют два вида дескрипторов:

ВидПризнакПример
дескрипторы не-данныхналичие только __get__()staticmethod(), classmethod()
дескрипторы данныхналичие __get__() и других методов протоколаproperty()

Внимание
Обращения к дескрипторам обрабатывает метод __getattribute__(), и его перекрытие препятствует автоматическим вызовам дескрипторов.

Пример определения протокола дескриптора и привязки дескриптора к классу:

    class MyDescriptor:

def __set__(self, instance, value):
...

def __get__(self, instance, owner):
...

def __delete__(self, instance):
...

def __set_name__(self, owner, name):
...


class MyClass:

field1 = MyDescriptor()
field2 = MyDescriptor()

Внимание
Если в __dict__ владельца имеется запись с ключём, совпадающим с именем атрибута, указывающего на дескриптор, то в случае дескрипторов не-данных при обращении к атрибуту вернётся значение из __dict__, а не из дескриптора. В случае дескрипторов данных наоборот — значение из дескриптора.
Синонимы поиска: Descriptor (дескриптор), descriptors, дескрипторы
На заметку
Зарегистрированные пользователи могут получать еженедельный дайджест обновлений на сайте.