Дескрипторы в Python
Python
Senior
Яндекс
Что такое дескриптор в Python? Объясните разницу между data-descriptor и non-data-descriptor и приведите пример практического использования.
Ответы
Descriptor protocol
Дескриптор — объект, реализующий один или несколько методов протокола дескрипторов: `__get__`, `__set__`, `__delete__`. Он управляет доступом к атрибуту класса.
Data-descriptor реализует `__set__` и обычно имеет высший приоритет (например, `property`, поля `dataclasses`). Non-data-descriptor реализует только `__get__` (например, функции в классе → методы).
Пример простого дескриптора валидации:
```python
class Positive:
def __set__(self, instance, value):
if value < 0:
raise ValueError('value must be >= 0')
instance.__dict__['_value'] = value
def __get__(self, instance, owner):
if instance is None:
return self
return instance.__dict__['_value']
class Account:
balance = Positive()
acc = Account()
acc.balance = 10
```