перегрузка произвольного оператора в python - PullRequest
2 голосов
/ 10 июля 2020

Можно ли перегрузить произвольные операторы в Python? Или один из них ограничен списком операторов, которые связаны с методами magi c, как указано здесь: https://www.python-course.eu/python3_magic_methods.php?

Я спрашиваю, потому что заметил, что Numpy использует Оператор @ для выполнения матричного умножения, например, C=A@B, где A, B - Numpy массивы, и мне было интересно, как они это сделали.

Изменить: оператора @ нет в списке, с которым я связан.

Может ли кто-нибудь указать мне на источник Numpy, где это делается?

1 Ответ

2 голосов
/ 10 июля 2020

В Python нельзя создавать новые операторы, нет. Определив эти функции «magi c», вы можете повлиять на то, что происходит, когда объекты вашего собственного определения управляются с использованием стандартных операторов.

Однако список, на который вы ссылаетесь, не является полным. В Python 3.5 они добавили специальные методы для оператора @. Вот довольно краткий список в документации модуля оператора Python и здесь - документы по перегрузке оператора .

operator.matmul(a, b)

operator.__matmul__(a, b)

Возврат a @ b.

Новое в версии 3.5.

Я не видел этого оператора лично, поэтому немного поработал больше исследований. Он предназначен специально для умножения матриц . Но я смог использовать его для других целей, хотя я бы возражал против этого из соображений стиля:

In [1]: class RichGuyEmailAddress(str): 
   ...:     def __matmul__(self, domain_name): 
   ...:         return f'{self}@{domain_name}' 
   ...:                                                                                                                                                                                       

In [2]: my_email = RichGuyEmailAddress('billg') @ 'microsoft.com'                                                                                                                              

In [3]: print(my_email)                                                                                                                                                                       
billg@microsoft.com

Итак, нет, вы не можете перегрузить любой случайный символ, но вы можете перегрузить оператор @.

...