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 :

Héritage classe et fonction


Sujet :

Python

  1. #1
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut Héritage classe et fonction
    Bonjour à tous,

    J'ai un fichier main.py qui lorsqu'il est lancé me créé un objet Configuration afin de récupérer un chemin et un nom de fichier dans un fichier qui s'appel config.ini:

    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
     
    import sys
    import time
     
    from Module.config import config
     
    class LoadAll():
     
        def __init__(self, BulkFile) :
            #Load Configuration file (config.ini)
            self.Configuration = config.ConfigIniFile("config.ini")
            print self.Configuration.homepath
            print self.Configuration.configfilename
            time.sleep(5)
     
    if __name__ == "__main__" :
     
        f = sys.argv[1:][0]
        LoadAll(f)

    Le fichier config.py dans lequel j'ai une classe comme définie ci dessous et qui est appelé dans le fichier main.py est le suivant:

    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
     
    class ConfigIniFile():
     
        def __init__(self, configfile):
            with open(configfile, "r") as self.configini :
                for self.lines in self.configini :
                    self.line = self.lines.strip().split("=")
     
                    if self.line[0].strip() == "[home]" and self.line[1].strip() != "":
                        self.homepath = self.line[1].strip()
     
                            #Check if path is a directory
                            if os.path.exists(self.homepath):
                                pass
     
                            else :
                                print "ERROR path does not exist !"
     
                    if self.line[0].strip() == "[home]" and self.line[1].strip() == "":
                        print "ERROR home path does not declared !"
     
                    if self.line[0].strip() == "[ConcaFileName]" and self.line[1].strip() != "":
                        self.configfilename = self.line[1].strip()
     
                    if self.line[0].strip() == "[ConcaFileName]" and self.line[1].strip() == "":
                        print "ERROR file name is not defined !"
     
     
    if __name__ == "__main__" :
     
        Config = ConfigIniFile("config.ini")
    Dans un autre fichier Listing.py où je n'ai pas de classe mais juste une fonction, je souhaite récupérer le self.homepath :

    Pour l'instant je fait comme ceci et ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    from Module.config import config
     
    def ListingPath():
        Configuration = config.ConfigIniFile("config.ini")
        home = Configuration.homepath
    sauf que je n'ai pas l'impression que ce soit la bonne méthode car je suis obligé de recréer un objet Configuration.

    L'object Configuration que je créé dans le fichier main.py existe, je dois donc être capable de le récupérer sans devoir le recréer ?

    J'ai regardé du coté des héritages, mais de ce que j'ai pu lire ce n'est vrai que pour les classes, mais pas entre classe et méthode ou inversement ? Vous me confirmez ?

    Merci d'avance pour vos réponses.

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

    Citation Envoyé par nekcorp Voir le message
    L'object Configuration que je créé dans le fichier main.py existe, je dois donc être capable de le récupérer sans devoir le recréer ?
    Si vous avez une fonction qui crée un objet toto:
    Comment une fonction g pourrait récupérer l'objet 123 assigné à "toto" ?
    Est ce que çà change quoi que ce soit que "f" et "g" soient ou pas dans le même "module"?

    note: pour les "class" vous avez aussi la notion de Singleton qui permet d'avoir un accès à l'instance qui a déjà été créée (plutôt qu'en créer un autre).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Comment une fonction g pourrait récupérer l'objet 123 assigné à "toto" ?

    - W
    function_g.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def g():
        toto = 123
        return toto
    function_f.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from function_g import g
     
    def f():
        print g()
     
     
     
    if __name__ == "__main__" :
        f()
    Résultat :
    Est ce que çà change quoi que ce soit que "f" et "g" soient ou pas dans le même "module"?
    Non, ça ne change rien.

    Par contre lorsque la fonction est une méthode de class cela change la manière dont on lui fait appel.

    Exemple :

    function_g.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class G :
        def g():
            toto = 123
            return toto
    function_f.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from function_g import G
     
    def f():
        print G.g
     
     
     
    if __name__ == "__main__" :
        f()
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <unbound method G.g>
    Avec ce deuxième cas j'ai pas le résultat souhaité même si je n'ai pas d'erreurs, a moins que je me trompe quelque part !

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

    Oui mais forcez un peu le trait côté espace de noms:
    Citation Envoyé par nekcorp Voir le message
    function_g.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def g():
        toto = 123
        return toto
    function_f.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import function_g as G
     
    def f():
        print G.g()
     
     
     
    if __name__ == "__main__" :
        f()
    Et vous trichez un peu car si la fonction "retourne" quelque chose vous n'accédez pas à la variable locale "toto".


    Par contre lorsque la fonction est une méthode de class cela change la manière dont on lui fait appel.

    Exemple :

    function_g.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class G :
        def g():
            toto = 123
            return toto
    function_f.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from function_g import G
     
    def f():
        print G.g
     
     
     
    if __name__ == "__main__" :
        f()
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <unbound method G.g>
    Avec ce deuxième cas j'ai pas le résultat souhaité même si je n'ai pas d'erreurs, a moins que je me trompe quelque part !
    Vous avez oublié les "()": la méthode n'est pas appelée!!
    Ceci dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class G :
        def g():
            toto = 123
            return toto
     
    def f():
        print G.g()
     
    if __name__ == "__main__" :
        f()
    "class" et "module" sont des espaces de noms ainsi que les "instances":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class G :
        def g(self):
            toto = 123
            return toto
     
    def f():
        print G().g()
     
    if __name__ == "__main__" :
        f()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Oui mais forcez un peu le trait côté espace de noms:
    C'est à dire ? Vous voulez me faire dire variable locale / globale ?
    Passer par une variable globale serait une solution mais je pense pouvoir m'en passer non ?

    Et vous trichez un peu car si la fonction "retourne" quelque chose vous n'accédez pas à la variable locale "toto".
    Oui, mais bon c'est pas faux . Mais c'est vrai votre remarque est pertinente, passer par un return ne me convient pas non plus et ça ne répond pas à ma question de départ !!!!

    Avec ce dernier code en corrigeant les erreurs j'obtiens None

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class G :
        def g(self):
            toto = 123
     
    def f():
        print G().g()
     
     
     
    if __name__ == "__main__" :
        f()

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

    Citation Envoyé par nekcorp Voir le message
    Avec ce dernier code en corrigeant les erreurs j'obtiens None
    Les méthodes sont un peu plus que des fonctions mais restent des fonctions et, avec Python, None est ce que retourne, par défaut, une fonction.

    C'est à dire ? Vous voulez me faire dire variable locale / globale ?
    Passer par une variable globale serait une solution mais je pense pouvoir m'en passer non ?
    Accéder à configuration via une variable est le seul moyen de passer quelque chose à une fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def ListingPath(configuration):
         home = configuration.homepath
    ou mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def ListingPath(home):
        ...
    car est-ce que cette fonction a besoin d'autre chose?

    Une autre approche serait de faire de ListingPath une méthode de la classe Configuration.
    Enfin, vous pouvez aussi faire de la class Configuration un Singleton (mais dans ce cas, la variable globale sera la "class" Configuration).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/03/2007, 12h02
  2. Classes ou fonctions ?
    Par alceste dans le forum C++
    Réponses: 6
    Dernier message: 27/06/2006, 12h44
  3. héritages multiples et fonctions abstraites
    Par julien.sagnard dans le forum C++
    Réponses: 4
    Dernier message: 21/10/2005, 14h58
  4. problème classe et fonction
    Par zmatz dans le forum C++
    Réponses: 14
    Dernier message: 19/10/2005, 21h46
  5. Classes - Sub/Fonction vs Property
    Par j_bolduc dans le forum ASP
    Réponses: 6
    Dernier message: 24/08/2005, 19h19

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