comment on definit un operator sur un classe ?

Le
JBB
class A (object):
pass

a1 = A()
a2 = A()

je veux pouvoir tester
a1 < a2

c'est forcement tout con mais j'ai du mal à le trouver dasn la doc
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Maric Michaud
Le #618850
class A (object):
pass

a1 = A()
a2 = A()

je veux pouvoir tester
a1 < a2

c'est forcement tout con mais j'ai du mal à le trouver dasn la doc...


C'est dans la référence du langage :

http://docs.python.org/ref/specialnames.html

JBB
Le #618849
class A (object):
pass

a1 = A()
a2 = A()

je veux pouvoir tester
a1 < a2

c'est forcement tout con mais j'ai du mal à le trouver dasn la doc...


C'est dans la référence du langage :

http://docs.python.org/ref/specialnames.html
merci


et il vaut mieux redefinir
__cmp__( self, other)
ou alors le paquet ?
__lt__( self, other)
__le__( self, other)
__eq__( self, other)
__ne__( self, other)
__gt__( self, other)
__ge__( self, other)

et n'y aurait il pas un moyen d'importer (ou deriver) quelque chose qui ferait que l'on ai besoin que de redefinir __gt__
tous les autres operateurs pouvant etres deduits:
a > b si b < a
a != b si a < b et b < a
a <= b si not(b < a)
a >= b si not(a < b)
a == b si not (a != b)


Maric Michaud
Le #618848
class A (object):
pass

a1 = A()
a2 = A()

je veux pouvoir tester
a1 < a2

c'est forcement tout con mais j'ai du mal à le trouver dasn la doc...


C'est dans la référence du langage :

http://docs.python.org/ref/specialnames.html
merci


et il vaut mieux redefinir
__cmp__( self, other)
ou alors le paquet ?
__lt__( self, other)
__le__( self, other)
__eq__( self, other)
__ne__( self, other)
__gt__( self, other)
__ge__( self, other)

et n'y aurait il pas un moyen d'importer (ou deriver) quelque chose qui
ferait que l'on ai besoin que de redefinir __gt__
tous les autres operateurs pouvant etres deduits:
a > b si b < a
a != b si a < b et b < a
a <= b si not(b < a)
a >= b si not(a < b)
a == b si not (a != b)


Si tu veux n'en redéfinir qu'un c'est __cmp__, sinon les autres ne
valent que pour un seul opérateur.

La déduction n'est pas voulue, on peut imaginer des arithmétiques où ce
serait faux, et certains utilisent ces opérateurs riches pour autre
chose que de la comparaison (effet de bord, notation à la iostream en C++).



Eric Brunel
Le #618447
On Tue, 29 May 2007 15:19:06 +0200, JBB [snip]
et il vaut mieux redefinir
__cmp__( self, other)
ou alors le paquet ?
__lt__( self, other)
__le__( self, other)
__eq__( self, other)
__ne__( self, other)
__gt__( self, other)
__ge__( self, other)


(Attention: maths devant!)
__cmp_ ne permet de définir que des relations d'ordre total, c'est à dire
que deux instances de ta classe doivent toujours être comparables.
Les autres te permettent aussi de définir des relations d'ordre partiel,
c'est à dire que not(a < b) n'implique pas a >= b. Ca a l'air bizarre au
début, mais je subodore (je n'ai pas vérifié) que ces méthodes ont été
introduites pour les ensembles, dans lesquelles la relation d'ordre
"naturelle" est la relation d'inclusion, qui est une relation d'ordre
partiel (si l'ensemble E1 n'est pas inclus dans l'ensemble E2, ça ne veut
pas dire que E2 est inclus dans E1).

et n'y aurait il pas un moyen d'importer (ou deriver) quelque chose qui
ferait que l'on ai besoin que de redefinir __gt__
tous les autres operateurs pouvant etres deduits:
a > b si b < a
a != b si a < b et b < a
(Heu..., a < b et b < a est normalement toujours faux; sinon, ta relation

d'ordre a un sacré coup dans l'aile...)
a <= b si not(b < a)
a >= b si not(a < b)
a == b si not (a != b)


Si tous ça est forcément toujours vrai (à part le second...), c'est que
ton ordre est total. Donc utilise __cmp__.

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"

JBB
Le #618446
On Tue, 29 May 2007 15:19:06 +0200, JBB [snip]
et il vaut mieux redefinir
__cmp__( self, other)
ou alors le paquet ?
__lt__( self, other)
__le__( self, other)
__eq__( self, other)
__ne__( self, other)
__gt__( self, other)
__ge__( self, other)


(Attention: maths devant!)
__cmp_ ne permet de définir que des relations d'ordre total, c'est à
dire que deux instances de ta classe doivent toujours être comparables.
Les autres te permettent aussi de définir des relations d'ordre partiel,
c'est à dire que not(a < b) n'implique pas a >= b. Ca a l'air bizarre au
début, mais je subodore (je n'ai pas vérifié) que ces méthodes ont été
introduites pour les ensembles, dans lesquelles la relation d'ordre
"naturelle" est la relation d'inclusion, qui est une relation d'ordre
partiel (si l'ensemble E1 n'est pas inclus dans l'ensemble E2, ça ne
veut pas dire que E2 est inclus dans E1).

et n'y aurait il pas un moyen d'importer (ou deriver) quelque chose
qui ferait que l'on ai besoin que de redefinir __gt__
tous les autres operateurs pouvant etres deduits:
a > b si b < a
a != b si a < b et b < a
(Heu..., a < b et b < a est normalement toujours faux; sinon, ta

relation d'ordre a un sacré coup dans l'aile...)
a != b si a < b ou b < a

j'ai ecrit un peu vite
a <= b si not(b < a)
a >= b si not(a < b)
a == b si not (a != b)


Si tous ça est forcément toujours vrai (à part le second...), c'est que
ton ordre est total. Donc utilise __cmp__.

HTH



Publicité
Poster une réponse
Anonyme