Определенный пользователем метод __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
но для этого потребуется переопределить каждую функцию, которую я хочу использовать, с моими определяемыми пользователем классами.
Есть ли способ правильно выполнить встроенную функцию?
Ответы
Ответ 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__