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 :

class : variable globale ou locale


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut class : variable globale ou locale
    bonjour à tous,

    voici mon code:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    import time
    import threading
    from threading import Thread, RLock
     
    verrou= threading.Lock()
     
    class Point(threading.Thread):
     
        result = 0
        def __init__(self,duree,x,y):
            threading.Thread.__init__(self)
     
            self.duree = duree 
            self.x = x
            self.y = y
     
     
        def run(self):
            while True:
                verrou.acquire()
                Point.result= self.Calcul()
                verrou.release()
     
     
        def Calcul(self):
            result = self.x + self.y 
            return result
     
     
     
    class Affichage(threading.Thread):
     
        def __init__(self):
            threading.Thread.__init__(self)
     
        def run(self):
            while True:
                time.sleep(2)
                verrou.acquire()
                h = Point.result
                verrou.release()
     
                print(h)
     
     
     
    p0 = Point(0.5,1,0)
    p4 = Affichage()
     
    p0.start()
    p4.start()
     
    p0.join()
    p4.join()
    comme vous pouvez le voir la class Point possede la variable result , et je suis obligé de l'initialiser car je l'utilise a la class Affichage, mais la variable result = 0 est une variable globale? c'est comme si elle etait dans def __init__(self) ?

    merci d'avance pour vos éclaircissement

  2. #2
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 577
    Points : 1 989
    Points
    1 989
    Par défaut
    Bonjour, ici result est associé à la classe et non à une instance donc si tu instancie un objet result sera la même pour tout les objets par contre si tu la mets dans ton constructeur elle sera spécifique à chaque objet .

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Tu n'est pas cohérent dans tes attributs, à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        def run(self):
            while True:
                verrou.acquire()
                Point.result= self.Calcul()
                verrou.release()
    tu devrais avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        def run(self):
            while True:
                verrou.acquire()
                self.result= self.Calcul()
                verrou.release()
    et à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        def run(self):
            while True:
                time.sleep(2)
                verrou.acquire()
                h = Point.result
                verrou.release()
     
                print(h)
    ce serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        def run(self):
            while True:
                time.sleep(2)
                verrou.acquire()
                h = p0.result
                verrou.release()
     
                print(h)
    p0 est dans l'espace global, lorsque tu fais Point.result ce n'est pas l'instance p0 mais un autre Point, non instancié celui-là, et qui ne possède pas d'attribut result.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    Citation Envoyé par cosmoff Voir le message
    comme vous pouvez le voir la class Point possede la variable result , et je suis obligé de l'initialiser car je l'utilise a la class Affichage, mais la variable result = 0 est une variable globale? c'est comme si elle etait dans def __init__(self) ?
    "result" est un attribut de "class".
    Ils sont utilisés pour donner une valeur par défaut (si nécessaire) aux attributs des instances voire à les documenter plus simplement.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> class A:
    ...    result = 0
    ...    def calcul(self):
    ...        self.result = 10
    ...
    >>> a = A()
    >>> print(a.result)
    0
    L'attribut existe même s'il n'y a pas d'__init__ et lorsqu'on y accède, la valeur par défaut est retournée.
    On peut "modifier" celui de l'instance en appelant la fonction "calcul":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a.calcul()
    >>> print(a.result)
    10
    >>> print(A.result)
    0>>>
    Mais l'attribut de la class n'a pas changé.

    Comme vous voyez, pas la peine de faire des choses compliquées pour "voir" comment çà fonctionne.

    - W

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    un grand merci, a vous 3 l'explication est parfaite

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

Discussions similaires

  1. Variable globale et locale
    Par Super_carotte dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 17/05/2010, 13h58
  2. variables globales et locales
    Par une_tite_question dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 25/06/2008, 18h32
  3. Variable globale et locale
    Par momo70 dans le forum MATLAB
    Réponses: 1
    Dernier message: 03/07/2007, 09h49
  4. variables globales ou locales
    Par exhortae dans le forum C
    Réponses: 6
    Dernier message: 09/04/2007, 01h29
  5. variable globale ou locale pour CurrentDB
    Par jibouze dans le forum VBA Access
    Réponses: 7
    Dernier message: 30/05/2006, 17h15

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