Определить псевдонимы методов в Python?
У меня есть векторный класс, и я определил метод __mul__
для умножения вектора на число.
Вот способ __mul__
:
def __mul__(self, other):
x = self.x * other
y = self.y * other
new = Vector()
new.set_pos((x, y))
return new
Моя проблема в том, что я не знаю, что между числом и вектором.
Если self - это число, self.x вызывает ошибку. (Возможно, я ошибаюсь в этом вопросе: "Другое" всегда число?)
Итак, я нашел здесь: Python: переопределение умножения
что я мог бы сделать:
__rmul__ = __mul__
но как я могу это сделать в определении класса?
Что-то вроде:
def __rmul__ = __mul__
Ответы
Ответ 1
self
никогда не будет числом в __mul__()
, потому что объект, к которому привязан метод, не является числом, он является вектором и по определению является множителем.
other
будет числом, если ваш объект умножается на число. Или это может быть что-то другое, например, другой вектор, который вы можете проверить и обработать.
Когда ваш объект является множителем, вызывается __rmul__()
, если мультипликатор не знает, как обрабатывать операцию.
Чтобы обрабатывать случай, в котором __mul__
и __rmul__
должен быть одним и тем же методом, поскольку операция является коммутативной, вы можете просто выполнить назначение в определении вашего класса.
class Vector(object):
def __mul__(self, other):
pass
__rmul__ = __mul__
Ответ 2
Просто укажите его как атрибут:
__rmul__ = __mul__
Точно так же вы должны создать псевдоним функции в модуле; создание псевдонима метода внутри тела класса работает одинаково.
Ответ 3
Дело в том, что в Python вы можете указать объектам, как их умножать. Это означает, что
a * b
может означать "tell a
, чтобы умножить себя на b
" или "tell b
, чтобы умножить себя на a
". В коде это означает
a.__mul__(b)
или
b.__rmul__(a)