Python: переопределение умножения

30

Итак, у меня есть собственный класс с функцией __mul__ , которая работает с целыми числами. Тем не менее, в моей программе (в библиотеках) он вызывается наоборот, то есть 2 * x , где x моего класса. Есть ли способ, которым я могу использовать для этого функцию __mul__ ?

    
задан Colin DeClue 01.08.2011 в 00:02
источник

2 ответа

33

Просто добавьте следующее в определение класса, и все будет хорошо:

__rmul__ = __mul__
    
ответ дан Karl Knechtel 01.08.2011 в 00:05
  • Обратите внимание, что это не всегда будет то, что вы хотите. Предположим, что у вас есть векторные и матричные классы, и вы хотите определить умножение между ними, рассматривая вектор как матрицу 1xN. Матричное умножение не является коммутативным, поэтому вам нужно будет повторно переключить порядок аргументов. –  Karl Knechtel 01.08.2011 в 06:24
23

Реализуйте также __rmul__ .

class Foo(object):
    def __mul__(self, other):
        print '__mul__'
        return other
    def __rmul__(self, other):
        print '__rmul__'
        return other

x = Foo()
2 * x # __rmul__
x * 2 # __mul__
    
ответ дан Cat Plus Plus 01.08.2011 в 00:05