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

Какие знаешь служебные функции в классе Python?

1.6 Junior🔥 221 комментариев
#Python Core

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

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

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

Служебные функции в классах 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.