9.5. Специальные методы классов.

Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Самоучитель Python 3, собранный из материалов данного сайта. Предназначен в основном для тех, кто хочет изучить язык программирования Python с нуля.

Специальные методы классов, также известные как магические методы или методы-дандеры (от англ. double underscore, т.е. "__"), являются методами, которые Python вызывает автоматически в определенные моменты времени. Эти методы обеспечивают специальное поведение объектов в Python, позволяя определить пользовательские действия для стандартных операций, таких как инициализация объекта, доступ к его атрибутам, вызов функции `len()` для объекта, операции сравнения и т. д.
 
1. __init__(self, ...)
Метод инициализации, вызывается при создании нового экземпляра класса. Он используется для инициализации атрибутов объекта.
class MyClass:
    def __init__(self, x):
        self.x = x

obj = MyClass(5)
 
2. __str__(self)
Метод, вызываемый функцией `str()` для получения строкового представления объекта. Он должен возвращать строку, которая будет отображаться при вызове функции `str()`.
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"Point({self.x}, {self.y})"

point = Point(3, 4)
print(str(point))  # Вывод: Point(3, 4)
 
3. __repr__(self)
Метод, вызываемый функцией `repr()` для получения формального строкового представления объекта. Он должен возвращать строку, которая является действительным выражением Python, создающим экземпляр объекта.
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Point({self.x}, {self.y})"

point = Point(3, 4)
print(repr(point))  # Вывод: Point(3, 4)
 
4. __len__(self)
 Метод, вызываемый функцией `len()` для получения размера объекта. Он должен возвращать целое число, представляющее длину объекта.
class MyList:
    def __init__(self, items):
        self.items = items

    def __len__(self):
        return len(self.items)

my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list))  # Вывод: 5
 
5. __eq__(self, other)
Метод, вызываемый для выполнения операции сравнения "равенство" (`==`). Он должен возвращать `True`, если объекты равны, и `False` в противном случае.
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

point1 = Point(3, 4)
point2 = Point(3, 4)
print(point1 == point2)  # Вывод: True
 
6. __lt__(self, other)
Метод, вызываемый для выполнения операции сравнения "меньше" (<). Он должен возвращать True, если объект меньше другого объекта, и False в противном случае.
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __lt__(self, other):
        return (self.x ** 2 + self.y ** 2) < (other.x ** 2 + other.y ** 2)

point1 = Point(3, 4)
point2 = Point(6, 8)
print(point1 < point2)  # Вывод: True (25 < 100)
 
7. __le__(self, other)
Метод, вызываемый для выполнения операции сравнения "меньше или равно" (<=). Он должен возвращать True, если объект меньше или равен другому объекту, и False в противном случае.
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __le__(self, other):
        return (self.x ** 2 + self.y ** 2) <= (other.x ** 2 + other.y ** 2)

point1 = Point(3, 4)
point2 = Point(6, 8)
point3 = Point(3, 4)
print(point1 <= point2)  # Вывод: True (25 <= 100)
print(point1 <= point3)  # Вывод: True (25 <= 25)
 
8. __gt__(self, other)
Метод, вызываемый для выполнения операции сравнения "больше" (>). Он должен возвращать True, если объект больше другого объекта, и False в противном случае.
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __gt__(self, other):
        return (self.x ** 2 + self.y ** 2) > (other.x ** 2 + other.y ** 2)

point1 = Point(6, 8)
point2 = Point(3, 4)
print(point1 > point2)  # Вывод: True (100 > 25)
 
9. __ge__(self, other)
Метод, вызываемый для выполнения операции сравнения "больше или равно" (>=). Он должен возвращать True, если объект больше или равен другому объекту, и False в противном случае.
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __ge__(self, other):
        return (self.x ** 2 + self.y ** 2) >= (other.x ** 2 + other.y ** 2)

point1 = Point(6, 8)
point2 = Point(3, 4)
point3 = Point(6, 8)
print(point1 >= point2)  # Вывод: True (100 >= 25)
print(point1 >= point3)  # Вывод: True (100 >= 100)
 
10. __add__(self, other)
Метод, вызываемый для выполнения операции сложения (+). Он позволяет определить, как объекты класса складываются друг с другом.
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 __repr__(self):
        return f"Vector({self.x}, {self.y})"

vector1 = Vector(1, 2)
vector2 = Vector(3, 4)
print(vector1 + vector2)  # Вывод: Vector(4, 6)
 
11. __sub__(self, other)
Метод, вызываемый для выполнения операции вычитания (-). Он позволяет определить, как объекты класса вычитаются друг из друга.
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __sub__(self, other):
        return Vector(self.x - other.x, self.y - other.y)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

vector1 = Vector(5, 7)
vector2 = Vector(3, 4)
print(vector1 - vector2)  # Вывод: Vector(2, 3)
 
12. __mul__(self, other)
Метод, вызываемый для выполнения операции умножения (*). Он позволяет определить, как объекты класса умножаются друг на друга или на скаляр.
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __mul__(self, other):
        if isinstance(other, (int, float)):
            return Vector(self.x * other, self.y * other)
        elif isinstance(other, Vector):
            return self.x * other.x + self.y * other.y  # Скалярное произведение

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

vector1 = Vector(2, 3)
print(vector1 * 3)  # Вывод: Vector(6, 9)

vector2 = Vector(4, 5)
print(vector1 * vector2)  # Вывод: 23 (2*4 + 3*5)
 
13. __truediv__(self, other)
Метод, вызываемый для выполнения операции деления (/). Он позволяет определить, как объекты класса делятся друг на друга или на скаляр.
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __truediv__(self, other):
        if isinstance(other, (int, float)):
            return Vector(self.x / other, self.y / other)
        raise TypeError("Делить можно только на число.")

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

vector1 = Vector(6, 9)
print(vector1 / 3)  # Вывод: Vector(2.0, 3.0)

 

14. __getitem__(self, key)
Метод, вызываемый для получения элемента по ключу (индексу). Он позволяет определить, как объекты класса ведут себя при доступе по индексу.
class MyList:
    def __init__(self, items):
        self.items = items

    def __getitem__(self, index):
        return self.items[index]

    def __repr__(self):
        return f"MyList({self.items})"

my_list = MyList([1, 2, 3, 4, 5])
print(my_list[2])  # Вывод: 3

 

15. __setitem__(self, key, value)
Метод, вызываемый для установки значения по ключу (индексу). Он позволяет определить, как объекты класса ведут себя при присвоении значений по индексу.
class MyList:
    def __init__(self, items):
        self.items = items

    def __setitem__(self, index, value):
        self.items[index] = value

    def __repr__(self):
        return f"MyList({self.items})"

my_list = MyList([1, 2, 3, 4, 5])
my_list[2] = 10
print(my_list)  # Вывод: MyList([1, 2, 10, 4, 5])

 

16. __delitem__(self, key)
Метод, вызываемый для удаления элемента по ключу (индексу). Он позволяет определить, как объекты класса ведут себя при удалении элементов по индексу.
class MyList:
    def __init__(self, items):
        self.items = items

    def __delitem__(self, index):
        del self.items[index]

    def __repr__(self):
        return f"MyList({self.items})"

my_list = MyList([1, 2, 3, 4, 5])
del my_list[2]
print(my_list)  # Вывод: MyList([1, 2, 4, 5])
 
17. __call__(self, *args, **kwargs)
Метод, позволяющий сделать экземпляр класса вызываемым, как функцию. Он позволяет определить, что произойдет, когда объект будет вызван как функция.
class Counter:
    def __init__(self):
        self.count = 0

    def __call__(self):
        self.count += 1
        return self.count

counter = Counter()
print(counter())  # Вывод: 1
print(counter())  # Вывод: 2
print(counter())  # Вывод: 3
 
18. __iter__(self)
Метод, который должен возвращать итератор для объекта. Он позволяет определить, как объект класса будет вести себя в цикле for.
class MyList:
    def __init__(self, items):
        self.items = items

    def __iter__(self):
        return iter(self.items)

    def __repr__(self):
        return f"MyList({self.items})"

my_list = MyList([1, 2, 3, 4, 5])
for item in my_list:
    print(item)
# Вывод:
# 1
# 2
# 3
# 4
# 5
 
19. __next__(self)
Метод, который возвращает следующий элемент итерации. Обычно используется в связке с __iter__ для создания итератора.
class MyRange:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.end:
            self.current += 1
            return self.current - 1
        else:
            raise StopIteration

my_range = MyRange(0, 5)
for number in my_range:
    print(number)
# Вывод:
# 0
# 1
# 2
# 3
# 4
 
20. __contains__(self, item)
Метод, который вызывается для проверки, содержится ли элемент в объекте (in). Он позволяет определить поведение объекта при использовании оператора in.
class MyList:
    def __init__(self, items):
        self.items = items

    def __contains__(self, item):
        return item in self.items

    def __repr__(self):
        return f"MyList({self.items})"

my_list = MyList([1, 2, 3, 4, 5])
print(3 in my_list)  # Вывод: True
print(6 in my_list)  # Вывод: False
 
21. __enter__(self) и __exit__(self, exc_type, exc_value, traceback)
Методы, используемые в контекстных менеджерах для работы с конструкцией with. Метод __enter__ вызывается при входе в блок with, а __exit__ — при выходе из него.
class MyContextManager:
    def __enter__(self):
        print("Входим в контекстный менеджер")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("Выходим из контекстного менеджера")

with MyContextManager() as manager:
    print("Внутри блока with")
# Вывод:
# Входим в контекстный менеджер
# Внутри блока with
# Выходим из контекстного менеджера

категории

ТЕОРИЯ

  • Введение в Python
  • Основы программирования на Python
  • Управляющие конструкции
  • Структуры данных
  • Функции и модули
  • Обработка исключений
  • Работа с файлами и потоками
  • файловая система
  • Объектно-ориентированное программирование (ООП)
  • Регулярные выражения
  • Дополнительные темы

Мы в соцсетях