Магические методы
Помимо обычных методов класса, в python имеются методы, которые, как правило, не вызываются напрямую, а вызываются встроенными функциями или операторами.
Например, метод __init__ перегружает конструктор класса. Конструктор - создание экземпляра класса.
>>> class A:
... def __init__(self, name):
... self.name = name
...
>>> a = A('Vasya')
>>> print(a.name)
Vasya
Список всех доступных магических методов есть в нашем справочнике.
Напишем для примера класс - вектор с двумя координатами, x и y:
import math
class Vector2D:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f'Vector2D({self.x}, {self.y})'
def __str__(self):
return f'({self.x}, {self.y})'
def __add__(self, other):
return Vector2D(self.x + other.x, self.y + other.y)
def __iadd__(self, other):
self.x += other.x
self.y += other.y
return self
def __sub__(self, other):
return Vector2D(self.x - other.x, self.y - other.y)
def __isub__(self, other):
self.x -= other.x
self.y -= other.y
return self
def __abs__(self):
return math.hypot(self.x, self.y)
def __bool__(self):
return self.x != 0 or self.y != 0
def __neg__(self):
return Vector2D(-self.x, -self.y)
Этот класс можно оформить как отдельный модуль, а можно и в главной программе. Посмотрим, какие операции мы переопределили:
>>> x = Vector2D(3, 4)
>>> x
Vector2D(3, 4)
>>> print(x)
(3, 4)
>>> abs(x)
5.0
>>> y = Vector2D(5, 6)
>>> y
Vector2D(5, 6)
>>> x + y
Vector2D(8, 10)
>>> x - y
Vector2D(-2, -2)
>>> -x
Vector2D(-3, -4)
>>> x += y
>>> x
Vector2D(8, 10)
>>> bool(x)
True
>>> z = Vector2D(0, 0)
>>> bool(z)
False
>>> -z
Vector2D(0, 0)
Определение специальных методов - очень полезная вещь. Однако не стоит ей слишком злоупотреблять. Определяйте их в собственных классах только тогда, когда вы уверены в том, что это поможет пониманию программного кода.
На этом курс "Основы Python" заканчивается, далее идут продвинутые лекции .
Если у Вас остались какие-либо вопросы - задавайте их в Telegram.