Страницы

Поиск по вопросам

суббота, 21 марта 2020 г.

Перегрузка оператора @ в Python

#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>

Комментариев нет:

Отправить комментарий