IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Enchainer construction et appel / comparaison profonde


Sujet :

Python

  1. #1
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut Enchainer construction et appel / comparaison profonde
    Bonjour,
    y a-t-il un moyen d'enchaîner la construction et l'appel d'une de ses méthodes ?

    Voici un bout de code pour comprendre ma question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Spam: 
        def __init__(self): 
            self.eggs = 0 
        def set (self,x,message): 
            self.eggs = x 
            print message,': eggs =',self.eggs
    ce qui fonctionne mais ne me plait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    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 qui me plait mais ne fonctionne pas (s2 vaut None)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s2 = Spam().set( 5,'appels enchainés') # appels enchainés : eggs = 5 
    print s2                               # None
    Et d'ailleur, pourquoi ai-je None ?
    Je n'arrive pas à comprendre le mécanisme sous-jacent de python qui me donne None...

    Attention, je ne veux pas polluer ma fontion __init__ en ajoutant un paramètre x.
    Ici, c'est un exemple très simplifié.
    Dans mon vrai code, __init__ a déjà plein de paramètres et je trouverais très laid d'en ajouter juste pour résoudre ce problème.


    And now for something completely different !
    Un autre problème, celui de la comparaison profonde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Bean: 
        def __init__ (self,x): 
            self.eggs = x 
     
    bean1 = Bean( 5 ) 
    bean2 = Bean( 5 ) 
    print bean1 == bean2 # False
    Comment recevoir True ?
    Autrement dit, y a-t-il un moyen de comparer les contenus (et non les pointeurs) ?

    Voilà, si quelqu'un a des idées, je suis preneur.

    Merci d'avance.
    Hadrien
    (z'avez vu, j'ai mis des balises CODE )
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

  2. #2
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Citation Envoyé par sopsag Voir le message
    Bonjour,
    y a-t-il un moyen d'enchaîner la construction et l'appel d'une de ses méthodes ?

    Voici un bout de code pour comprendre ma question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Spam: 
        def __init__(self): 
            self.eggs = 0 
        def set (self,x,message): 
            self.eggs = x 
            print message,': eggs =',self.eggs
    ce qui fonctionne mais ne me plait pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    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
    A part en recréant une fonction qui fait ses 2 successivement ses 2 étapes, je vois pas.
    Si tu veux simplement que cela tienne en une ligne, utilise le ; entre les 2 instructions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s1 = Spam() ; s1.set( 12,'appels séparés')
    Citation Envoyé par sopsag Voir le message
    ce qui me plait mais ne fonctionne pas (s2 vaut None)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s2 = Spam().set( 5,'appels enchainés') # appels enchainés : eggs = 5 
    print s2                               # None
    Et d'ailleur, pourquoi ai-je None ?
    Je n'arrive pas à comprendre le mécanisme sous-jacent de python qui me donne None...
    s2 a la valeur de retour de la fonction set, donc None
    Citation Envoyé par sopsag Voir le message
    Attention, je ne veux pas polluer ma fontion __init__ en ajoutant un paramètre x.
    Ici, c'est un exemple très simplifié.
    Dans mon vrai code, __init__ a déjà plein de paramètres et je trouverais très laid d'en ajouter juste pour résoudre ce problème.
    si ta fonction __init__ est déjà inbuvable, c'est qu'elle est peut-être mal conçue ? Tu peux utiliser les *args et **dict: http://python.developpez.com/faq/?pa...nFuncSurcharge

    Citation Envoyé par sopsag Voir le message
    And now for something completely different !
    Un autre problème, celui de la comparaison profonde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Bean: 
        def __init__ (self,x): 
            self.eggs = x 
     
    bean1 = Bean( 5 ) 
    bean2 = Bean( 5 ) 
    print bean1 == bean2 # False
    Comment recevoir True ?
    Autrement dit, y a-t-il un moyen de comparer les contenus (et non les pointeurs) ?

    Voilà, si quelqu'un a des idées, je suis preneur.

    Merci d'avance.
    Hadrien
    (z'avez vu, j'ai mis des balises CODE )
    tu peux surcharger la fonction égalité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> class Bean(object):
    	def __init__ (self,x):
    		self.eggs = x
    	def __eq__(self, other):
    		return self.eggs == other.eggs
     
     
    >>> b =Bean(5)
    >>> c = Bean(5)
    >>> b == c
    True
    quelques détails ici: http://python.developpez.com/faq/?pa...ratorSurcharge

  3. #3
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    en retournant l'objet par la méthode set et en implementant la méthode __repr__ tu peux obtenir le comportement désiré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # -*- coding: iso-8859-15 -*-
    class Spam(object):
     
        def __init__(self):
            self.eggs = 0
     
        def set(self, x, message):
            self.eggs = x
            print message, ': eggs = ', self.eggs
            return self
     
        def __repr__(self):
            return "%s" % self.eggs
     
     
    s1 = Spam()
    s1.set(12, 'appels séparés')
    print s1
     
    s2 = Spam().set(5, 'appels enchainés')
    print s2
    on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    appels séparés : eggs =  12
    12
    appels enchainés : eggs =  5
    5
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  4. #4
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut Super !
    Mais bon sang, mais c'est bien sûr, None c'est le retour de set !
    Il suffisait d'ajouter return self !
    En fait, tout ça c'est pour faire une élégante compréhension de liste .

    Quant à la comparaison profonde, j'esperais une fonction super sioux qui utiliserait l'introspection pour tester récursivement l'égalité de 2 instances, champ par champ.
    Surcharger __eq__ donne un meilleur controle mais suppose de le faire pour toutes les sous classes.
    Ca fait très c++ mais ça me va...

    Merci à vous 2
    (super ton ornithorynque pacificator)
    [WinXP sp3 / Visual 2005 / Eclipse Ganymede / Python 2.6]
    Hadrien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. enchainement des appels dans un projet
    Par Smix007 dans le forum C#
    Réponses: 0
    Dernier message: 15/06/2011, 15h17
  2. [PHP 5.3] [POO] Enchainement des appels
    Par ETVigan dans le forum Langage
    Réponses: 2
    Dernier message: 10/05/2010, 13h57
  3. appel à témoignage sur la construction d'IHM web
    Par romeo2009 dans le forum JSF
    Réponses: 0
    Dernier message: 28/04/2010, 08h04
  4. [VBA-E] Construction d'un arbre d'appels
    Par FenX. dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/05/2007, 09h57
  5. Construction et comparaison de BigInteger
    Par noOneIsInnocent dans le forum Langage
    Réponses: 2
    Dernier message: 27/03/2007, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo