Appeler une méthode d?objet juste construit / comparaison profonde

gaspos Messages postés 17 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 20 février 2009 - 20 févr. 2009 à 10:52
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 - 28 févr. 2009 à 19:21
Bonjour,


y a-t-il un moyen d’appeler méthode d’objet juste construit ?



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 




Voici un bout de code pour comprendre ma question :



 






class Spam:








    '''Une petite classe qui ne sert qu'à donner un exemple.'''








    def __init__(self):








        self.eggs = 0








    def set (self,x,message):








        self.eggs = x








        print message,': eggs =',self.eggs







 






# ce que je suis obligé de faire mais qui fonctionne







s1 = Spam()







s1.set( 12,'appels séparés') # appels séparés : eggs = 12







print s1                     # <__main__.Spam instance at 0x00B557B0>







print s1.eggs                # 12







 






# ce que je voudrais pouvoir faire mais qui ne fonctionne pas







s2 Spam().set( 5,'appels enchainés') # appels enchainés : eggs 5






print s2                               # None



 




And now for something completely different !



 




Comparaison profonde :



 




voici un autre bout de code :



 






class Bean:








    def __init__ (self,x):








        self.eggs = x








       










bean1 = Bean( 5 )







bean2 = Bean( 5 )







print bean1 == bean2 # False






# y a-t-il un moyen de comparer les contenus (et non les pointeurs) ?



 




Voilà, si quelqu’un a une idée, je suis preneur…



 




Merci


Hadrien



 




 

3 réponses

gaspos Messages postés 17 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 20 février 2009
20 févr. 2009 à 16:50
C'est re-moi !
En relisant mon post je m'aperçois que je risque d'avoir droit à une réponse du genre :

"gros nigaud, t'as qu'à passer le paramètre 'x' directement au __init__ de ta classe Spam ! et pas besoin de la méthode set !"

Ce à quoi je réponds par avance :

"bé oui, dans ce cas d'école, bien sûr... mais dans mon vrai cas à moi, très simplifié ici, j'ai déjà un __init__ avec plein de paramètres, et je ne veux pas le polluer avec un autre qui ne serait là que pour ça..."

Hadrien
0
aera group Messages postés 382 Date d'inscription mercredi 23 août 2006 Statut Membre Dernière intervention 8 novembre 2010 18
24 févr. 2009 à 10:49
Ah enfin une question intéressante merci l'ami !

Pour réaliser ce que tu veux faire, il faut utilisé des méthodes particulières sur les classes référencés en anglais () à cette adresse!
En gros, voici un exemple pour résoudre tes 2 problèmes :

class Spam:
    def __init__(self):
        self.eggs = 0

    def__str__(self):
        return str(self.eggs)

    def __cmp__(self, other):
        return self.eggs - other.eggs

    def set (self,x,message):
        self.eggs = x
        print message,': eggs =',self.eggs
   

test1 = Spam()
test2 = Spam()
test3 = Spam()

test1.set(2,"Appel")
test2.set(5,"Test")
test3.set(5,"Une autre phrase")

print test1
print test2

print test1 < test2
print test1 > test2
print test1 == test2
print test2 == test3

Cette exemple montre bien comment résoudre ton problème. Cela dit dans ce que tu demandé tu voulais comparer l'appel d'une fonction :
s2 Spam().set( 5,'appels enchainés') # appels enchainés : eggs 5

print s2                               # None

Impossible de comparer l'appel d'une fonction, en faisant ça, tu enregistre dans c2 ce que renvoie la fonction c'est à dire rien : None
On ne peut que comparer des classes entières.

Précision :
__cmp__ permet de comparer deux classes. L'argument est l'adresse de la deuxième classe. pour comparer, la fonction doit renvoyer un  nombre issu normalement de la différence entre la première classe et la deuxième classe (négatif si class2>class1, etc ...)
Cela dit, faire la différence comme on vient de le faire ne permet de comparer qu'un paramètre ici eggs. Supposons le protocole suivant :
une classe Spam est supérieur à une autre ssi eggs1 > egg2 (egg1 appartient à la première classe et inversement). Si il y à égalité, alors, la phrase rentre en compte : Si la phrase est la même alors, les classes sont égales sinon, la classe supérieur à l'autre est celle qui à la phrase la première dans l'ordre alphabétique !

On doit écrire une classe Spam resemblant à ça :

class Spam:
    def __init__(self):
        self.eggs = 0
        self.message = ''
    def __str__(self):
        return str(self.eggs)
   
    def __cmp__(self, other):
        if self.eggs < other.eggs:
            return -1
        elif self.eggs > other.eggs:
            return 1
        else:
            if self.message < other.message:
                return 1
            if self.message > other.message:
                return -1
            else:
                return 0
   
    def set (self,x,message):
        self.eggs = x
        self.message = message
        print message,': eggs =',self.eggs
   

test1 = Spam()
test2 = Spam()
test3 = Spam()
test4 = Spam()

test1.set(2,"Appel")
test2.set(5,"Test")
test3.set(5,"Une autre phrase")
test4.set(5,"Une autre phrase")

print test1 < test2
print test1 == test2
print test2 == test3
print test2 > test3
print test3 == test4

Les tests confirmes que la fonction de comparaison est au point.
Deuxième précision la fonction __str__
renvoie obligatoirement une chaine de carractères. C'est cette fonction qui permet de renvoyer une valeur quand on utilse print (et uniquement il me semble) ! Pour renvoyer une valeur (en chaine de carractère) en toute condition il faut utiliser
__repr__ (qui fonctionne de la même manière).

Dernière chose, n'utilse pas set comme fonction, c'est un mot clé Python, utilse plutôt set_ ou tout autre mot qui n'est pas réservé par Python (il est d'ailleur étonnant que Python ne génère pas de message d'erreur)

Voila tu sait tout, bonne continuation ...
______

Aéra
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
28 févr. 2009 à 19:21
Bonjour,

Il me semble que pour pouvoir écrire:

s = Spam().set(...)

il suffit de terminer la fonction set par

return self

Bonne prog,
0
Rejoignez-nous