web-dev-qa-db-fra.com

surcharge de l'opérateur dans python

Doublons possibles:
Python: définir mes propres opérateurs?
Règles générales pour savoir quand utiliser la surcharge d'opérateur en python

Est-il possible de surcharger les opérateurs en Python? Si oui, peut-on définir de nouveaux opérateurs, tels que ++ et <<?

43
Ahmad Dwaik

Comme d'autres réponses l'ont mentionné, vous pouvez en effet surcharger les opérateurs (en définissant des méthodes spéciales dans la classe que vous écrivez, c'est-à-dire des méthodes dont les noms commencent et se terminent par deux traits de soulignement). Tous les détails sont ici .

Pour compléter les réponses à vos questions: vous ne pouvez pas définir de nouveaux opérateurs; mais << n'est pas un nouvel opérateur, c'est un opérateur existant, et il est surchargé en définissant dans la classe la méthode __lshift__ .

Comme note historique, c'est aussi à peu près la situation en C++ - mais l'ensemble exact d'opérateurs que vous pouvez surcharger diffère entre les deux langages. Par exemple, en C++, vous ne pouvez pas surcharger l'accès aux attributs, .; en Python, vous pouvez, avec __getattr__ (ou __getattribute__, avec une sémantique différente) et __setattr__. Vice versa, dans Python = (affectation simple) n'est pas un opérateur, vous ne pouvez donc pas le surcharger, alors qu'en C++ c'est un opérateur et vous pouvez le surcharger.

<< est un opérateur, et peut être surchargé, dans les deux langues - c'est ainsi << et >>, tout en ne perdant pas leur connotation initiale de décalage gauche et droit, est également devenu un opérateur de formatage d'E/S en C++ (pas en Python! -).

71
Alex Martelli

Voir: http://docs.python.org/reference/datamodel.html#special-method-names .

Une classe peut implémenter certaines opérations qui sont appelées par une syntaxe spéciale (telles que des opérations arithmétiques ou des indices et des tranches) en définissant des méthodes avec des noms spéciaux. Il s'agit de l'approche de Python en matière de surcharge des opérateurs, permettant aux classes de définir leur propre comportement par rapport aux opérateurs de langage.

6
miku

Oui et non. Je ne pense pas que vous puissiez définir vos propres opérateurs, mais vous pouvez surcharger les opérateurs existants - vous pouvez le faire en remplaçant la méthode spéciale de l'opérateur. Par exemple, pour remplacer>, vous pouvez remplacer __gt__(), pour! = Remplacer __ne__() et ainsi de suite.

4
Sudhir Jonathan