Магические методы
Помимо обычных методов класса, в 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.