Дескриптор - это

Tags:

Published 22 июля 2025 г. 17:45 by max_summer

Дескриптор — это объект в Python, который определяет, как обращаться к атрибуту другого объекта. Он позволяет контролировать доступ к атрибутам, их чтение, запись и удаление, используя специальные методы.

Основные методы дескриптора:

  1. __get__(self, instance, owner) — вызывается при доступе к атрибуту.
  2. __set__(self, instance, value) — вызывается при присваивании значения атрибуту.
  3. __delete__(self, instance) — вызывается при удалении атрибута.

Пример простого дескриптора:

```python class Descriptor: def get(self, instance, owner): print("Getting attribute") return instance._value

def __set__(self, instance, value):
    print("Setting attribute")
    instance._value = value

def __delete__(self, instance):
    print("Deleting attribute")
    del instance._value

class MyClass: attr = Descriptor() # Дескриптор как атрибут класса

obj = MyClass() obj.attr = 42 # Вызовет set print(obj.attr) # Вызовет get del obj.attr # Вызовет delete ```

Типы дескрипторов:

  1. Дескриптор данных — реализует __set__ и __get__ (или хотя бы один из них).
  2. Недескриптор данных — реализует только __get__ (например, методы класса или статические методы).

Применение:

Дескрипторы часто используются для: - Валидации данных. - Логирования доступа к атрибутам. - Реализации свойств (@property — это упрощённый дескриптор). - Создания сложных атрибутов (например, в ORM, как в Django или SQLAlchemy).

Пример с валидацией:

```python class PositiveNumber: def set(self, instance, value): if value <= 0: raise ValueError("Value must be positive") instance._value = value

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

class MyClass: number = PositiveNumber()

obj = MyClass() obj.number = 10 # OK obj.number = -5 # ValueError ```

Таким образом, дескрипторы предоставляют мощный механизм для управления атрибутами объектов в Python.

Share this post

Similar posts

There are no similar posts yet.

0 comments

There are no comments

Add a new comment