Специальные методы классов, также известные как магические методы или методы-дандеры (от англ. 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
# Выходим из контекстного менеджера