Определить псевдонимы методов в 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)