Какие знаешь служебные функции в классе Python?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Служебные функции в классах Python (магические методы)
В Python служебные функции — это специальные методы, которые начинаются и заканчиваются двойным подчёркиванием (dunder methods, "магические методы"). Они позволяют объектам взаимодействовать с встроенными функциями и операторами Python.
Основные категории магических методов
1. Инициализация и представление объектов
__init__(self, ...) — конструктор, вызывается при создании экземпляра класса
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
__new__(cls, ...) — создание нового экземпляра (вызывается перед __init__)
__del__(self) — деструктор, вызывается при удалении объекта
__str__(self) — строковое представление для пользователей (используется print() и str())
class Person:
def __str__(self):
return f"{self.name}, {self.age} лет"
__repr__(self) — официальное представление объекта для разработчиков (используется в интерпретаторе)
class Person:
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
2. Арифметические операторы
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other): # obj1 + obj2
return Vector(self.x + other.x, self.y + other.y)
def __sub__(self, other): # obj1 - obj2
return Vector(self.x - other.x, self.y - other.y)
def __mul__(self, scalar): # obj * скаляр
return Vector(self.x * scalar, self.y * scalar)
def __truediv__(self, scalar): # obj / скаляр
return Vector(self.x / scalar, self.y / scalar)
def __floordiv__(self, scalar): # obj // скаляр
return Vector(self.x // scalar, self.y // scalar)
def __mod__(self, other): # obj % other
pass
def __pow__(self, power): # obj ** power
pass
3. Операторы сравнения
class Person:
def __eq__(self, other): # ==
return self.name == other.name and self.age == other.age
def __ne__(self, other): # !=
return not self.__eq__(other)
def __lt__(self, other): # <
return self.age < other.age
def __le__(self, other): # <=
return self.age <= other.age
def __gt__(self, other): # >
return self.age > other.age
def __ge__(self, other): # >=
return self.age >= other.age
4. Работа с контейнерами
class MyList:
def __init__(self, items):
self.items = items
def __len__(self): # len(obj)
return len(self.items)
def __getitem__(self, index): # obj[index]
return self.items[index]
def __setitem__(self, index, value): # obj[index] = value
self.items[index] = value
def __delitem__(self, index): # del obj[index]
del self.items[index]
def __contains__(self, item): # item in obj
return item in self.items
def __iter__(self): # for item in obj
return iter(self.items)
def __reversed__(self): # reversed(obj)
return reversed(self.items)
5. Вызываемые объекты
__call__(self, ...) — позволяет вызывать объект как функцию
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, x):
return x * self.factor
multiply_by_3 = Multiplier(3)
result = multiply_by_3(5) # вызов как функция
print(result) # 15
6. Атрибуты
class SmartObject:
def __getattr__(self, name): # obj.attr если attr не существует
return f"Атрибут {name} не найден"
def __setattr__(self, name, value): # obj.attr = value
super().__setattr__(name, value)
def __delattr__(self, name): # del obj.attr
super().__delattr__(name)
def __getattribute__(self, name): # доступ к ЛЮБОМУ атрибуту
return super().__getattribute__(name)
7. Контекстные менеджеры
class FileManager:
def __init__(self, filename):
self.filename = filename
def __enter__(self): # начало блока with
self.file = open(self.filename)
return self.file
def __exit__(self, exc_type, exc_val, exc_tb): # конец блока with
if self.file:
self.file.close()
return False
with FileManager(file.txt) as f:
content = f.read()
8. Другие полезные методы
__hash__(self) — хеш объекта (для использования в dict/set)
__format__(self, format_spec) — форматирование строк f-strings
__sizeof__(self) — размер объекта в байтах
__class_getitem__(cls, item) — поддержка квадратных скобок для класса
Практический пример: собственный класс Number
class Number:
def __init__(self, value):
self.value = value
def __str__(self):
return f"Number({self.value})"
def __repr__(self):
return f"Number({self.value})"
def __add__(self, other):
return Number(self.value + other.value)
def __eq__(self, other):
return self.value == other.value
def __lt__(self, other):
return self.value < other.value
def __call__(self, x):
return self.value * x
n1 = Number(5)
n2 = Number(3)
print(n1 + n2) # Number(8)
print(n1 == n2) # False
print(n1 < n2) # False
print(n1(4)) # 20
Знание магических методов критично для написания «питоничного» кода и создания объектов, которые естественно взаимодействуют с встроенным функционалом Python.