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 :

Appeler une variable d'une classe extérieur


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Par défaut Appeler une variable d'une classe extérieur
    Bonjour, j'ai un programme en python (2.7) dans lequel j'essaye d'appeler une variable qui se trouve dans une autre classe que celle de la source de l'appelle. J'obtiens une erreur et je tourne en rond sans résultat. 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
    #!usr/bin/python
    # -*-coding:utf-8-*-
     
     
    class class1:
        def func1(self):
            var = 2
            print ("var in class1 : %s" % var)
     
     
    class class2:
        def func1(self):
            var = class1().func1().var # <-- PROBLÈME
            var = var + 2
            print ("var in class2 : %s" % var)
     
    if __name__ == "__main__":
        class2().func1()
    Voici l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    File "test.py", line 18, in <module>
        class2().func1()
      File "test.py", line 13, in func1
        var = class1().func1().var
    AttributeError: 'NoneType' object has no attribute 'var'
    Avez-vous une piste pour résoudre ce problème ?

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Drôle de notation !

    Pourquoi ne pas vous servir tout bonnement de la valeur de retour d'une fonction ?

    Comme ceci :

    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
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
     
     
    class class1:
        def func1(self):
            var = 2
            print ("var in class1 : %s" % var)
            return var # solution ?
     
     
    class class2:
        def func1(self):
            var = class1().func1()
            var = var + 2
            print ("var in class2 : %s" % var)
     
    if __name__ == "__main__":
        class2().func1()
    PS: vos en-têtes de fichier provoquent des erreurs sous Linux, attention à mettre les bonnes mentions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    @+.
    Dernière modification par Invité ; 13/06/2014 à 00h16. Motif: Inutile de citer entièrement le message précédent

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Par défaut
    Drôle de notation !
    Du coup, quelle est la notation correcte ? S'il y en a une.

    Pourquoi ne pas vous servir tout bonnement de la valeur de retour d'une fonction ?
    Tout simplement parce qu'à terme je vais devoir appeler tout un tas d'objets et que je ne préfère pas utiliser la valeur de retour pour des dizaines d'objets. (sauf si c'est l'unique solution...)

    PS: vos en-têtes de fichier provoquent des erreurs sous Linux
    C'est étrange, je suis sous linux et je viens de vérifier à l'instant. Cela ne provoque pas d'erreur chez moi.

    EDIT : bien que mes entêtes ne provoquent pas d'erreur chez moi, leur écriture n'est pas "standard". C'est corrigé.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Mat08 Voir le message
    Tout simplement parce qu'à terme je vais devoir appeler tout un tas d'objets et que je ne préfère pas utiliser la valeur de retour pour des dizaines d'objets. (sauf si c'est l'unique solution...)
    Dans ce cas, utilisez les membres de 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
     
     
    class class1:
        def __init__(self):
            # init membres de classe
            self.var1 = None
            self.var2 = 10
            self.var3 = 20
            # ...etc...
     
        def func1(self):
            self.var1 = 2
            print ("var in class1 : %s" % self.var1)
     
     
    class class2:
        def __init__(self):
            # init membres de classe
            self.var1 = None
            # ...etc...
     
        def func1(self):
            objet = class1()
            objet.func1()
            self.var1 = objet.var1
            self.var1 += 2
            print ("var in class2 : %s" % self.var1)
     
    if __name__ == "__main__":
        class2().func1()
    Peut-être devriez-vous commencer par lire quelques tutoriels sur la question : http://www.developpez.net/forums/d13...r/#post7516008

    @+.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 736
    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 736
    Par défaut
    Salut,

    Pour que ça fonctionne "class1().func1()" doit retourner un objet de type class, instance ou module.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> class A:
    ...    var = 0
    ...    def f(self):
    ...        self.var += 1
    ...        return self
    ...
    >>> def c():
    ...     print (A().f().var)
    ...
    >>> c()
    1
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre éclairé
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Par défaut
    La solution avec les membres de classe fonctionne bien et correspond à ce que je veux.

    Je vais reprendre ces tutos pour y voir plus clair. Je ne les ai que survolés pour l'instant.

    Wiztricks je vais aussi me pencher sur ton exemple qui semble fonctionner.

    Merci à vous deux.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 736
    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 736
    Par défaut
    Citation Envoyé par Mat08 Voir le message
    Je vais reprendre ces tutos pour y voir plus clair. Je ne les ai que survolés pour l'instant.
    Le tuto a lire est plutôt le Python tutorial mais vos questions portent plutôt sur l'organisation des relations entre classes/instances. Les tutos pour çà sont plutôt à chercher du côté du forum ALM et dans le fourre-tout "pattern de conception".

    - 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. Appel de variables d'une fonction dans une autre fonction
    Par black cat747 dans le forum Interfaces Graphiques
    Réponses: 13
    Dernier message: 11/05/2010, 15h34
  2. récupérer une variable d'une fonction dans une classe
    Par free_dom dans le forum Général Python
    Réponses: 20
    Dernier message: 08/07/2009, 12h35
  3. Garder une référence vers une variable d'une autre classe
    Par choupeo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2007, 18h30
  4. Appliquer une methode a une variable d une classe ?
    Par Slumpy dans le forum VB.NET
    Réponses: 18
    Dernier message: 07/06/2007, 17h17
  5. Réponses: 6
    Dernier message: 20/04/2007, 15h24

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