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 :

problèmes avec un classe


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Par défaut problèmes avec un classe
    Bonjour,

    Je débute en Python mais la quand même je ne comprend pas du tout le comportement de ma classe.
    Je vous copie l'exemple qui me surprend:
    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
    >>> class var():
        def __init__(self,dname,dunit='',dcomment='',dTval=[]):
            self.name=dname
            self.unit=dunit
            self.comment=dcomment
            self.Tval=dTval
     
     
    >>> A=var('A')
    >>> B=var('B')
    >>> A.Tval
    []
    >>> B.Tval
    []
    >>> A.Tval.append(1)
    >>> A.Tval
    [1]
    >>> B.Tval
    [1]
    comment se fait-il que la modification de la variable Tval de l'instance A modifie également la variable Tval de l'instance B?
    Y'a quelque chose que je n'ai pas du bien comprendre...

    Merci de votre aide.
    Etienne

  2. #2
    Expert confirmé
    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 : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Il faut faire attention aux paramètres par défaut qui sont des objets.
    Ceux-ci ne sont créés qu'une seule fois et peuvent être modifiés

    Donc soit, tu fais une copie du paramètre quand tu le récupère (sinon, cela ne copie que la référence sur l'objet)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> class var():
        def __init__(self,dname,dunit='',dcomment='',dTval=[]):
            self.name=dname
            self.unit=dunit
            self.comment=dcomment
            self.Tval=dTval[:]
    Soit tu utilises un paramètres à None et tu testes le paramètre au début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> class var():
        def __init__(self,dname,dunit='',dcomment='',dTval=None):
            if dTval == None: dTval = []
            self.name=dname
            self.unit=dunit
            self.comment=dcomment
            self.Tval=dTval

  3. #3
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 74
    Par défaut
    Dans la documentation de Python :

    Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that that same “pre-computed” value is used for each call. This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified. This is generally not what was intended. A way around this is to use None as the default, and explicitly test for it in the body of the function.
    Voici une façon de corriger ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class var:
      def __init__(self, dname, dunit='', dcomment='', dTval=None):
        self.name=dname
        self.unit=dunit
        self.comment=dcomment
        if dTval is None:
          self.Tval=[]
    Edit: grilled pendant l'écriture du post

  4. #4
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 46
    Par défaut
    Merci pour la vitesse des réponses !
    et claires en plus.
    J'avais effectivement loupé quelque chose...

    Merci

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

Discussions similaires

  1. [POO] PHP5 : Problème avec les classes
    Par fleur_de_rose dans le forum Langage
    Réponses: 9
    Dernier message: 06/05/2006, 19h09
  2. Problème avec une classe... "without object"
    Par z980x dans le forum C++
    Réponses: 8
    Dernier message: 27/04/2006, 16h00
  3. [PHPMailer] problème avec la classe phpmailer
    Par sansouna24 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 08/04/2006, 16h51
  4. Problème avec la classe Calendar
    Par afrikha dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 30/03/2006, 08h48
  5. Réponses: 9
    Dernier message: 25/09/2005, 16h33

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