Определить псевдонимы методов в Python?

у меня есть векторный класс, и я определил __mul__ способ умножения вектора на число.

здесь __mul__ способ :

def __mul__(self, other):
    x = self.x * other
    y = self.y * other
    new = Vector()
    new.set_pos((x, y))
    return new

моя проблема в том, что я не знаю, что есть что между числом и вектором. Если само количество, само.x вызывает ошибку. (Возможно, я ошибаюсь в этом вопросе:" другое " всегда число ?)

я нашел здесь : Python: переопределение умножения это я могу сделать. :

__rmul__ = __mul__

но как я могу это сделать в определении класса ?

что-то типа :

def __rmul__ = __mul__

3 ответов


self никогда не будет в __mul__() поскольку объект, к которому присоединен метод, не является числом, это вектор, и по определению это мультипликат.

other будет числом, если ваш объект умножается на число. Или это может быть что-то еще, например, другой вектор, который можно проверить и отрегулировать.

когда ваш объект является множителем,__rmul__() вызывается, если multiplicand не знает, как обрабатывать операция.

для обработки случая, в котором __mul__ и __rmul__ должен быть тот же метод, потому что операция коммутативна, вы можете просто выполнить назначение в своем определении класса.

class Vector(object):
    def __mul__(self, other):
        pass

    __rmul__ = __mul__

Просто перечислите его как атрибут:

__rmul__ = __mul__

таким же образом вы создадите псевдоним функции в модуле; создание псевдонима метода в теле класса работает одинаково.


дело в том, что в Python вы можете сказать объектам, как умножить себя на вещи. Это значит, что

a * b

может означать "скажи a умножить само на b" или "сказать b умножить само на a". В коде это переводится как

a.__mul__(b)

или

b.__rmul__(a)