begin process at 2010 03 11 22:26:49
  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 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 Il me manque une librairie [ par cipher16 ] Bonjour ... je viens de commencer à coder en python ... et il semblerai qu'il me manque une librairie ayant un rapport avec internet ... J'ai cherché Comment ouvrir une page web? [ par tipro75 ] Comment peut-on ouvrir un fichier (text dans ce cas(format html dans ce cas)) sur internet exemple :je veut lire une page toute les 1 minute pour voir Python 3.0 [ par xeolin ] Que pensez vous de la version 3.0 de python ? De la modifiquation de la commande "print" ? Perso, moi je trouve que c'est une bonne chose MAIS pas p Class has no attribute !?!? [ par RV2931 ] BonjourJ'ai récupéré un petit programme "Hello world" d'un tuto wxPython de développez.com que voici :# !/usr/bin/python#  -*- coding: iso885915 -*-im héritage de wxObject et polymorphisme ?? [ par RV2931 ] Bonjour,Je programme en wxPython et j'aurai voulu savoir comment dériver un objet wx pour faire un bouton personalisé par exemple, avec des informatio connexion python [ par tsic ] Bonjour, Voilà, j'ai débuté recemment avec python et je veux faire une connexion client serveur (windows) par l'intermédiaire d'une interface QT Desig


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

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,593 sec (3)

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