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ème de variable statique


Sujet :

Python

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut Problème de variable statique
    Bonsoir,

    j'ai besoin d'une variable de classe statique qui contient la première instance de la classe. J'ai naïvement fait ça :

    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
     
    class A:
        master = None
     
        def __init__(self, l):
            if self.master:
                print str(self) + " n'est pas maitre"
                self.is_master = False
            else:
                print str(self) + " est maitre"
                self.master = self
                self.is_master = True
     
            self.l = l
     
     
    test = A([A([]), A([])])
    Contrairement à ce que j'attendais, les trois instances sont maître :

    <__main__.A instance at 0xb77264cc> est maitre
    <__main__.A instance at 0xb77264ec> est maitre
    <__main__.A instance at 0xb77265cc> est maitre
    Si quelqu'un peut m'expliquer pourquoi, et comment résoudre mon problème (si possible sans utiliser une variable globale), ça serait sympa

  2. #2
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Je n’en suis pas vraiment sûr, mais je dirais que quand tu assignes self.master, tu crées une variable d’instance qui “écrase” dans cet objet la variable de classe… Enfin bref, je n’ai pas creusé la théorie, mais en tout cas, en faisant explicitement appel à la classe (au moins pour l’assignation), ça m’a tout l’air de marcher :

    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
    class A:
        master = None
     
        def __init__(self, l):
            if self.__class__.master: # ici, c’est optionnel, tu peux conserver self.master…
                print(str(self) + " n'est pas maitre")
                self.is_master = False
            else:
                print(str(self) + " est maitre")
                self.__class__.master = self # ici, par contre, obligé de passer par __class__
                self.is_master = True
     
            self.l = l
     
     
    test = A([A([]), A([])])
    …me donne (sous python2.6 comme 3.2) :

    <__main__.A object at 0x7fe9dd65e610> est maitre
    <__main__.A object at 0x7fe9dd65e710> n'est pas maitre
    <__main__.A object at 0x7fe9dd65e750> n'est pas maitre

  3. #3
    Membre habitué
    Avatar de Zorro
    Inscrit en
    Août 2002
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 137
    Points : 130
    Points
    130
    Par défaut ClassMethod et StaticMethod
    Cherche du coté des classmethod et staticmethod.
    voir dans cette discussion.

    Z
    Coure-moi après que je t’attrape.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je suis d'accord avec mont29 sur le fait que l'affectation de self.master crée une nouvelle variable appartenant à l'instance de classe (instance dont l'adresse est 'self').

    Pour que ça reste une variable appartenant à la classe, Il suffit de la préfixer par le nom de la classe: A.master.

    Voilà un petit exemple qui montre que master est dans ce cas bien partagée par toutes les instances de la classe:

    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
    class A:
        master = None
     
        def affecte(self, chaine):
            A.master= chaine
     
        def affiche(self):
            print A.master
     
    x = A()
    y = A()
     
    x.affecte("toto")
    y.affiche()
    toto
    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Merci

    Je m'étais inspiré d'un vieux post du forum où il était dit que <classe>.variable_statique et <instance>.variable_statique étaient synonymes, mais effectivement, ça ne l'est pas.

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Autre approche

    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
    22
    23
    24
    25
    26
    27
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    class A(object):
     
        def __init__(self, m={}):
     
            self.m = m
     
            if 'master' in self.m:
                print(str(self) + " n'est pas maitre")
                self.is_master = False
            else:
                print(str(self) + " est maitre")
                self.m['master'] = self
                self.is_master = True
     
        def getmaster(self):
            return 'le maitre de ' + str(self) + ' est ' + str(self.m['master'])
     
    test = A()
    print(test.getmaster())
    test = A()
    print(test.getmaster())
    test = A()
    print(test.getmaster())
    Après tout ce n'est qu'une histoire de conteneur.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,
    Je suis d'accord, c'est une question de boîte... et il y a plusieurs "façons" pour traiter cette asymétrie "dans la boîte".
    Boîte "classe" et __new__:
    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
    22
    class Base(object):
     
        @property
        def is_master(self):
            return self.master is self
     
        def __str__(self):
            return 'is_master: %s' % self.is_master
     
    class A1(Base):
     
        master = None
        def __new__(cls, *args, **kwds):
            instance = object.__new__(cls)
            if cls.master is None:
                cls.master = instance
            return instance
     
    a = A1()
    b = A1()
    print a
    print b
    L'inconvénient est que la classe étant, par défaut, "singleton", il ne va pas être simple d'avoir plusieurs ensemble ayant des "masters" différents. On peut "utiliser" __call__ ainsi pour résoudre cela:
    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
    class A2(Base):
     
        def __init__(self, master=None, *args, **kwds):
            self.master = self
     
        def __call__(self, *args, **kwds):
            clone = self.__class__(*args, **kwds)
            clone.master = self.master
            return clone
     
    F = A2()
    a = F()
    b = F()
    print F
    print a
    print b
    Ce sont des constructions pythonesques autour des classes à connaître mais à utiliser avec modération.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. [VB.NET] Probléme de variable
    Par Silvia12 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/03/2005, 11h51
  2. [Debutant(e)]problème de variable d'environnement
    Par tolsam dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 12/08/2004, 19h08
  3. Problème de variable
    Par vp dans le forum Windows
    Réponses: 2
    Dernier message: 14/05/2004, 16h27
  4. [Débutant] Problème de variables
    Par bonnefr dans le forum SWT/JFace
    Réponses: 9
    Dernier message: 12/05/2004, 17h41
  5. [servlet]problème de variable jamais nulle
    Par omega dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/03/2004, 09h31

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