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 :

Questions sur les classes


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    magasinié
    Inscrit en
    Décembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : magasinié

    Informations forums :
    Inscription : Décembre 2018
    Messages : 34
    Points : 21
    Points
    21
    Par défaut Questions sur les classes
    Bonsoir,

    J'ai une autre question :

    J'ai 2 modules, module1 et module 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    module1
    class test:
        def __init__(self,data):
            self.data = data
     
    module2
    import module1
    class test2:
        ....
    Est-il possible de récupérer la variable data dans ma classe test2 sans devoir appeler la class test ? Si il y a une méthode spécial ou une astuce magique.
    J'utilise une class pour récupérer un fichier et y extraire des choses, donc j'utilise comme paramètre le data dans un troisième module et j'aimerais pouvoir utiliser les attributs dans un autre fichier ou je n'ai pas accès au data pour appeler la class.
    Après pas mal de recherches, je n'ai pas l'impression que c'est possible ^^

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par outiat Voir le message
    JJ'ai 2 modules, module1 et module 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    module1
    class test:
        def __init__(self,data):
            self.data = data
     
    module2
    import module1
    class test2:
        ....
    Est-il possible de récupérer la variable data dans ma classe test2 sans devoir appeler la class test ? Si il y a une méthode spécial ou une astuce magique.
    Non, aucune possibilité. Toutefois si tu regardes bien, la variable data ne provient pas de ta classe test. Elle s'y trouve, oui, mais elle y a été mise depuis l'extérieur. Donc peut-être que tu peux la récupérer depuis cet extérieur avant qu'elle entre dans la classe test.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bonjour,

    Est-il possible de récupérer la variable data dans ma classe test2 sans devoir appeler la class test ?
    Bah c'est surtout du bon sens que de faire cet appel à test pour récupérer la variable data.
    Sinon je vois pas trop l'intérêt de la création de cette classe.

    Même si on devait récupérer cette variable data, il faudra bien un moment avoir créé une instance de cette classe quelque-part.

    Maintenant si c'est une constante que tu souhaites récupérer d'une classe, c'est possible, dans ce cas tu auras besoin d'une variable de classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Test:    
        DATA = None
        def __init__(self, data):
             self.data = data
    puis l'appel à cette variable dans l'autre module,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from test import Test
     
    class Test2:
        def __init__(self, data=Test.DATA):
            self.data = data
     
    t = Test2()
    print(t.data)
    Sinon une classe est faîte pour construire de multiples instances, donc être appelée...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    puis l'appel à cette variable dans l'autre module,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class Test2:
        def __init__(self, data=Test.DATA):
    Moi j'ai dit que ce n'était pas possible car il avait précisé "sans devoir appeler la classe Test"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Moi j'ai dit que ce n'était pas possible car il avait précisé "sans devoir appeler la classe Test"...
    Ma deuxième solution n'est pas réellement une réponse à la question du PO, mais plus une proposition de conception différente.

    Une solution pourrait être de faire de la sérialisation, mais en vue du besoin actuel, je dirais que c'est overkill et que conceptuellement ça ressemble à du bricolage.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    et que conceptuellement ça ressemble à du bricolage.
    Oui, ça m'avait traversé l'esprit aussi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Pour que l'exemple de @fred1599 fonctionne, je dois écrire :

    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 Test:
        DATA = None
     
        def __init__(self, data):
            self.__class__.DATA = data
     
     
    class Test2:
        def __init__(self):
            self.data = Test.DATA
     
     
    obj = Test([1, 2, 3])
     
    t = Test2()
     
    print(t.data) #[1, 2, 3]

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Citation Envoyé par danielhagnoul Voir le message


    Pour que l'exemple de @fred1599 fonctionne, je dois écrire :

    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 Test:
        DATA = None
     
        def __init__(self, data):
            self.__class__.DATA = data
     
     
    class Test2:
        def __init__(self):
            self.data = Test.DATA
     
     
    obj = Test([1, 2, 3])
     
    t = Test2()
     
    print(t.data) #[1, 2, 3]
    Ça fonctionne je pense, la question reposait sur la création de deux modules (module1 et module2).
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par danielhagnoul Voir le message
    Pour que l'exemple de @fred1599 fonctionne, je dois écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Test:
        DATA = None
     
        def __init__(self, data):
            self.__class__.DATA = data
    Exact. Car en écrivant self.DATA=data on crée juste un attribut d'instance "DATA" qui masque l'attribut de classe "Test.DATA" (lequel reste toutefois toujours accessible depuis tout ce qui n'est pas instance).
    Bien vu
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Exact. Car en écrivant self.DATA=data on crée juste un attribut d'instance "DATA" qui masque l'attribut de classe "Test.DATA" (lequel reste toutefois toujours accessible depuis tout ce qui n'est pas instance).
    Bien vu
    Moins verbeux et lisible serait Test.DATA = data
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Moins verbeux et lisible serait Test.DATA = data
    Ouais mais... on lie alors une action au nom de la classe. Si ce nom évolue faut recoder l'action.
    Ou alors on définit __init__ comme une méthode de classe...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Test:
        DATA = None
     
        @classmethod
        def __init__(cls, data):
            cls.DATA = data
    ... ce qui permet alors aussi d'hériter de "Test" sans casser la logique...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre à l'essai
    Homme Profil pro
    magasinié
    Inscrit en
    Décembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : magasinié

    Informations forums :
    Inscription : Décembre 2018
    Messages : 34
    Points : 21
    Points
    21
    Par défaut
    Bonjour,
    Merci pour vos réponses
    Je me doutais que je ne pouvais pas le faire ^^

  13. #13
    Expert éminent

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

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

    À l'intérieur d'une application toutes les classes sont liées entre elles.

    L'application elle-même est lancée par un noyau qui se chargera d'instancier les divers autres objets et il suffira d'en suivre le fil conducteur pour accéder à tous les attributs de n'importe quel autre objet.

    Je pense que le PO devrait se demander pourquoi ses classes Test et Test1 ne peuvent communiquer entre elles alors que l'une a forcément instancié l'autre.

  14. #14
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ouais mais... on lie alors une action au nom de la classe. Si ce nom évolue faut recoder l'action.
    Ou alors on définit __init__ comme une méthode de classe...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Test:
        DATA = None
     
        @classmethod
        def __init__(cls, data):
            cls.DATA = data
    ... ce qui permet alors aussi d'hériter de "Test" sans casser la logique...
    Ah ok, là oui effectivement on va un peu plus loin du problème actuel,.. mais on réutilise bien le nom de la classe Test dans Test2

    Une solution différente pour le plaisir,

    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
    def create_class(name, data):    
        my_class = type(name, (), {'DATA': data})
        my_class.__init__ = lambda self, data: setattr(self, 'data', data)
        return my_class
     
     
    Test = create_class('Test', [1, 2, 3])
     
     
    class Test2:
        def __init__(self):
            self.data = Test.DATA
     
     
    t = Test2()
    print(t.data)  # [1, 2, 3]
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. question sur les classes "static"
    Par Asmod_D dans le forum C++
    Réponses: 4
    Dernier message: 05/04/2009, 17h27
  2. Questions sur les classes.
    Par Lartiste007 dans le forum Débuter
    Réponses: 4
    Dernier message: 05/04/2009, 14h46
  3. Questions sur les classes.
    Par DarkSeiryu dans le forum Windows Forms
    Réponses: 8
    Dernier message: 06/02/2009, 09h21
  4. Un question sur les classes
    Par willycat dans le forum C++
    Réponses: 10
    Dernier message: 22/08/2008, 17h55
  5. Questions sur les classes en C#
    Par greg2 dans le forum C#
    Réponses: 11
    Dernier message: 05/11/2007, 19h57

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