#python #python_3x #python_35 #перегрузка_операторов
Столкнулся с необходимостью перегрузки оператора @ в Python. Требуется чтобы объекты класса M могли взаимодействовать друг с другом через оператор @. Например: a = M() b = M() a @ b требуемая сигнатура поведения. Подскажите, какой магический метод отвечает за этот оператор. Заранее спасибо.
Ответы
Ответ 1
Для поддержки оператора @ нужно переопределить метод __matmul__ (Или __rmatmul__, если нужно реализовать ситуацию, когда слева от @ объект не поддерживающий оператор @, а справа объект нашего класса), для оператора @= - метод __imatmul__. Пример: class A: def __init__(self, x): self.x = x def __repr__(self): return 'A({})'.format(self.x) def __matmul__(self, other): print("Вызван метод __matmul__") if(isinstance(other, A)): return A(self.x * other.x) else: return A(self.x * other) def __rmatmul__(self, other): print("Вызван метод __rmatmul__") if(isinstance(other, A)): return A(self.x * other.x) else: return A(self.x * other) def __imatmul__(self, other): print("Вызван метод __imatmul__") return self @ other a2 = A(2) print(a2 @ A(3)) # Вывод: # Вызван метод __matmul__ # A(6) print(a2 @ 4) # Вывод: # Вызван метод __matmul__ # A(8) print(5 @ a2) # Вывод: # Вызван метод __rmatmul__ # A(10) a2 @= A(6) print(a2) # A(12) # Вывод: # Вызван метод __imatmul__ # Вызван метод __matmul__ # A(12) Документация: Emulating numeric typesОтвет 2
Он называется matmul: operator.matmul(a, b) operator.__matmul__(a, b) Return a @ b. Пример перекрытия: class M: def __matmul__(self, other): print(self, other) a = M() b = M() a @ b # <__main__.M object at 0x00000281C3A07860> <__main__.M object at 0x00000281C5935E10>
Комментариев нет:
Отправить комментарий