Подтвердить что ты не робот

Определенный пользователем метод __mul__ не является коммутативным

Я написал класс для представления векторов в Python (как упражнение), и у меня возникают проблемы с расширением встроенных операторов.

Я определил метод __mul__ для векторного класса. Проблема в том, что в выражении x * y интерпретатор вызывает метод __mul__ для x, а не y.

Итак, vector(1, 2, 3) * 2 возвращает вектор < 2, 4, 6 > так же, как должен; но 2 * vector(1, 2, 3) создает TypeError, потому что встроенный класс int не поддерживает умножение на мои определяемые пользователем векторы.

Я мог бы решить эту проблему, просто написав новую функцию умножения

def multiply(a, b):
    try:
        return a * b
    except TypeError:
        return b * a

но для этого потребуется переопределить каждую функцию, которую я хочу использовать, с моими определяемыми пользователем классами.

Есть ли способ правильно выполнить встроенную функцию?

4b9b3361

Ответ 1

Если вам нужна коммутативность для разных типов, вам нужно реализовать __rmul__(). Если он реализован, он вызывается, как и все специальные методы __r*__(), если в противном случае операция будет . Помните, что аргументы меняются:

class Foo(object):
    def __mul_(self, other):
        ''' multiply self with other, e.g. Foo() * 7 '''
    def __rmul__(self, other):
        ''' multiply other with self, e.g. 7 * Foo() '''

Ответ 2

Я считаю, что вы ищете __rmul__