Doublons Possibles:
Python: définir ma propre des opérateurs?
Règles de base pour savoir quand utiliser la surcharge d'opérateur en pythonEst-il possible de surcharger les opérateurs en Python? Si oui, peut-on définir de nouveaux opérateurs, comme
++
et<<
?
Réponses
Trop de publicités?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!-).
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.
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.