Приведи пример использования магических методов
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Магические методы в 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.