44 votes

surcharge d'opérateur en python

Doublons Possibles:
Python: définir ma propre des opérateurs?
Règles de base 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, comme ++ et <<?

71voto

Alex Martelli Points 330805

Comme d'autres réponses ont mentionné, vous pouvez en effet de la surcharge d'opérateurs (par definining spécial méthodes dans la classe que vous écrivez, c'est à dire, des méthodes dont les noms de début et de fin avec les deux caractères 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 existant, et il est surchargé par définition dans la classe de la méthode __lshift__.

Comme une note historique, c'est également assez bien la situation en C++,--, mais l'ensemble exact des opérateurs de la surcharge diffère entre les deux langues. Par exemple, en C++, vous ne pouvez pas surcharger l'attribut d'accès, .; en Python, vous pouvez, avec __getattr__ (ou __getattribute__, avec des sémantiques différentes) et __setattr__. Vice-versa, en Python = (plaine du travail) n'est pas un opérateur, de sorte que vous ne pouvez pas surcharger qui, alors qu'en C++ il est un opérateur et vous pouvez la surcharge.

<< est un opérateur, et peut être surchargée, dans les deux langues-c'est combien de << et >>, tout en ne perdant pas leur première connotation de droite et de gauche les quarts de travail, est également devenu I/O mise en forme des opérateurs en C++ (pas en Python!-).

6voto

miku Points 63392

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

Une classe peut implémenter certaines opérations qui sont invoquées par la syntaxe particulière (telles que des opérations arithmétiques ou subscripting et de tranchage) en définissant des méthodes ayant des noms spéciaux. C'est Python approche de la surcharge d'opérateur, permettant à des classes pour définir leur propre comportement à l'égard de la langue des opérateurs.

4voto

Sudhir Jonathan Points 6841

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X