← Назад к вопросам

Приведи пример использования магических методов

2.2 Middle🔥 231 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Магические методы в Python

Магические методы (dunder methods, от double underscore) — это специальные методы, которые Python вызывает неявно в определённых ситуациях. Они позволяют объектам кастомных классов взаимодействовать со встроенными функциями и операторами так же, как встроенные типы.

Основные примеры магических методов

1. Методы инициализации и представления

__init__ — конструктор объекта, вызывается при создании экземпляра. __str__ — возвращает строковое представление для пользователя (используется print()). __repr__ — возвращает техническое представление объекта (для отладки).

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __str__(self):
        return f"{self.name}, {self.age} лет"
    
    def __repr__(self):
        return f"Person(name='{self.name}', age={self.age})"

person = Person("Алексей", 30)
print(person)  # Алексей, 30 лет
print(repr(person))  # Person(name='Алексей', age=30)

2. Арифметические операторы

Магические методы позволяют перегружать операторы:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    def __sub__(self, other):
        return Vector(self.x - other.x, self.y - other.y)
    
    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2  # (4, 6)
v4 = v1 * 2   # (2, 4)

3. Работа с контейнерами

__len__ — возвращает длину объекта (для len()). __getitem__ — доступ по индексу obj[key]. __setitem__ — присваивание по индексу obj[key] = value. __contains__ — проверка наличия элемента (оператор in).

class CustomList:
    def __init__(self, items):
        self.items = items
    
    def __len__(self):
        return len(self.items)
    
    def __getitem__(self, index):
        return self.items[index]
    
    def __setitem__(self, index, value):
        self.items[index] = value
    
    def __contains__(self, item):
        return item in self.items

cl = CustomList([1, 2, 3, 4, 5])
print(len(cl))      # 5
print(cl[2])        # 3
print(3 in cl)      # True

4. Вызываемые объекты

__call__ — делает объект вызываемым как функция.

class Multiplier:
    def __init__(self, factor):
        self.factor = factor
    
    def __call__(self, x):
        return x * self.factor

mul3 = Multiplier(3)
print(mul3(5))  # 15
print(mul3(10)) # 30

5. Управление атрибутами

__getattr__ — вызывается при доступе к несуществующему атрибуту. __setattr__ — вызывается при присваивании атрибута.

class DynamicObject:
    def __init__(self):
        self._data = {}
    
    def __getattr__(self, name):
        if name.startswith('_'):
            raise AttributeError(f"'{name}' не найден")
        return self._data.get(name, "не установлен")
    
    def __setattr__(self, name, value):
        if name == '_data':
            super().__setattr__(name, value)
        else:
            self._data[name] = value

6. Управление контекстом

__enter__ и __exit__ — для использования с оператором with.

class FileManager:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        self.file = None
    
    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.file:
            self.file.close()
        return False

with FileManager('test.txt', 'w') as f:
    f.write('Привет, Python!')

Практическое применение

Магические методы используются повсеместно в NumPy, Pandas, SQLAlchemy, Flask, Django. Понимание этих методов — ключ к написанию pythonic кода и созданию интуитивных API.

Приведи пример использования магических методов | PrepBro