begin process at 2010 09 04 16:29:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Python

 > 

Divers

 > 

Débutant(e)

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

vendredi 20 février 2009 à 10:52:44 | Appeler une méthode d’objet juste construit / comparaison profonde

gaspos

Bonjour,

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

 

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

 

 

vendredi 20 février 2009 à 16:50:09 | Re : Appeler une méthode d’objet juste construit / comparaison profonde

gaspos

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

mardi 24 février 2009 à 10:49:19 | Re : Appeler une méthode d?objet juste construit / comparaison profonde

aera group

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
samedi 28 février 2009 à 19:21:40 | Re : Appeler une méthode d'objet juste construit

Chouchou182

Bonjour,

Il me semble que pour pouvoir écrire:

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


il suffit de terminer la fonction set par

return self

Bonne prog,
--
Chouchou.



Cette discussion est classée dans : self, print, s1, appels, eggs


Répondre à ce message

Sujets en rapport avec ce message

heklp serverSocket [ par Harvester_ ] Voila j'ai utliser un script du siteC'est un server socket qui marchait tres bien au debut(source)#!C:\Python23\python.exeimport SocketServerimport sy chat basique en python [ par rezuz ] bonjour, je suis en train d'essayer de programmer un chat en python, principalement dans le but d'apprendre l'utilisation des sockets et de la commun Allocation de mémoire et référence [ par benc77 ] Bonjour, je vous soumet un problème bizarre de collision de variables : Dans le code suivant, la méthode __init__ de la classe MySemTree ne semble p PYgtk bouton en premier plan [ par seb57sk8 ] Bonjour a tous et a toute, Je reviens a la charge pour une questionde positionnement de widget: J'utilise PYgtk et la methode fixed. j'aimerai que Tkinter, non déplacement d'un ballon incompréhensible [ par ubranov ] Bonjour, Je cherche simplement à animer un petit ballon dans une fenêtre grâce au module Tkinter. Je n'arrive vraiment pas à comprendre en quoi le co urllib2 et interface graphique [ par rezuz ] bonjour à tous. aprés avoir eu de nombreux "problemme" avec les 72 minutes de limitation vidéo de MEGAVIDEO, j'ai décidé de faire un programme qui se wxWindow::RegisterHotKey [ par DoudouBidou ] Bonjour à tous(au passage Merci pour ce site, depuis le temps que je l'attends...)J'utilise wxPython pour réaliser mon interface graphique mais je n'a Socket : charger ip depuis fichier [ par Shinji ] Bonjour @ ttes et @ ts, voici mon pb:  j'essaye de faire une petite app client/serveur et j'aimerais pouvoir enregister l'ip/port du serveur dans un IDLE : une mauvaise plaisanterie ? [ par steede ] Bonjour, je débute la programmation (enfin je m'y remets...et je suis autodidacte) et j'ai d'énormes problèmes  avec Python à savoir :   - toutes les Comment lancer son application !!!!!!!!!! [ par steede ] Voila, j'ai écrit (pompé) une malheureuse app (extraite d'un exemple "simple" de wx) et j'aimerais la faire fonctionner !!!!ci dessous la ligne de la


Nos sponsors


Sondage...

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales