Дескриптор – это любой объект Python, который определяет один или несколько из следующих специальных методов:
__get__ – вызывается при чтении атрибута__set__ – вызывается при записи атрибута__delete__ – вызывается при удалении атрибутаДескрипторы делятся на две категории:
__set__ и/или __delete__ (например, property)__get__ (например, функции, staticmethod)Дескрипторы данных имеют приоритет над __dict__ экземпляра, тогда как дескрипторы без данных – нет.
Когда ты обращаешься к obj.attr, механизм поиска атрибутов Python проверяет иерархию классов на наличие дескриптора перед тем, как обратиться к словарю экземпляра:
type(obj).__mro__ → дескриптор найден? → вызов __get__
→ нет дескриптора? → вернуть значение из __dict__ экземпляра
Дескрипторы обеспечивают работу множества встроенных возможностей:
property – оборачивает логику геттера/сеттера в чистый интерфейс атрибутаclassmethod и staticmethod – используют дескрипторы без данных для изменения способа вызова функций__slots__ – использует дескрипторы данных для эффективного управления хранилищем на уровне экземпляраclass Positive:
def __set_name__(self, owner, name):
self.name = name
def __get__(self, obj, objtype=None):
return getattr(obj, f"_{self.name}")
def __set__(self, obj, value):
if value <= 0:
raise ValueError("Must be positive")
setattr(obj, f"_{self.name}", value)
class Product:
price = Positive()
Дескрипторы – это основа системы доступа к атрибутам в Python, которая обеспечивает переиспользуемое, чистое и мощное управление атрибутами на уровне класса.
Data descriptor, который определяет одновременно __get__ и __set__, всегда будет иметь приоритет над значениями, хранящимися в __dict__ экземпляра.
Новый — ещё не проверен сообществом
Вы