Дескриптор — объект, реализующий
__get__, __set__ или __delete__. Если такой объект присвоен атрибуту класса, доступ через экземпляр идёт через эти методы.Два типа: — Data-дескриптор (
__set__/__delete__) — приоритет над __dict__ экземпляра. — Non-data (только __get__) — перекрывается __dict__ экземпляра.Порядок поиска атрибута: data-дескрипторы класса →
__dict__ экземпляра → non-data и обычные атрибуты класса → __getattr__.На дескрипторах построены
property, classmethod, staticmethod, cached_property, привязка методов к экземпляру и поля в dataclasses.class Positive:
def __set_name__(self, owner, name):
self.name = f'_{name}'
def __get__(self, obj, objtype=None):
return getattr(obj, self.name)
def __set__(self, obj, value):
if value <= 0:
raise ValueError("must be positive")
setattr(obj, self.name, value)
class Account:
balance = Positive()
Позволяет переиспользовать логику доступа к атрибутам без метаклассов и дублирования
property.Библиотека собеса по Python