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

wxPython Discussion :

Appel d'une fonction d'une class a partir d'une autre class


Sujet :

wxPython

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Appel d'une fonction d'une class a partir d'une autre class
    Bonjour,

    Imaginons que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Class A
    .
    .
    .
    .
     
     
    Class B
    .
    .
      def func...
    Je voudrai lancer la fonction "func" à partir de la Class A.
    Est-ce possible ?


    Merci

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

    Littéralement B.func(...) répond a votre question.

    Mais il serait bon que vous précisiez ce que vous voulez faire.
    Est ce que le sujet porte sur:
    • ce que fait ou pas l'interpréteur Python?
    • la différence entre classes et instances?
    • les différentes méthodes de la POO permettant de les associer?

    Cordialement,
    -W

  3. #3
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    "Yes you can".
    mais plus sérieusement il faut d'abord éclaircir les "détails" mentionnés par wiztricks.

    Alors en gros on a:
    1- ce que fait [ou pas] l'interpreteur: il peut faire B.func(...) le "soucis" c'est de passer les arguments corrects en nombre et en type(surtout le premier, de type <B>) à la classe si la méthode <B.func> n'est pas statique, et juste les arguments si elle l'est.

    2- la différence entre classes et instance... je pense que c'est pas le gros du soucis sinon...

    3- les différentes méthodes de la POO permettant de les assosier:
    Dans ce cas, la principale méthode (pour rendre la classe statique, serait):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class C:
        @staticmethod #decorateur
        def f(arg1, arg2, ...): ...
    -- directement tiré du Python-doc

    En espérant ne pas me déplacer dans le sens de la tangente

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

    Profitons de la réponse d'afranck64 pour clavarder (un peu) sur le premier point.

    Lorsqu'on écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> def bar(*args):
    ...     print (', '.join(str(x) for x in args))
    l'interpréteur rencontrant le mot clé "def" va créer un objet "fonction" avec la définition qui suit et l'associer à la clé "bar" dans globals().
    Pour les fonctions déclarées dans les classes, c'est un peu pareil...
    Mais forçons le trait en définissant la fonction ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> class A: 
    ...    foo = bar
    Rencontrant le mot clé "class", l'interpréteur crée un objet "class".
    Dans sa définition, nous disons que l'attribut "foo" sera définit par ce qu'il trouvera du "bar" dans globals().

    L'objet fonction "bar" peut maintenant être accédé via deux chemins:
    - "bar" résolu dans globals()
    - "A.foo" résolu dans globals() puis dans le dict associé à la class A.

    Nous avons ici quelque chose qui n'est pas "intuitif" et qui "perturbe" les débutants ou les habitués à des langages "compilés" : bien qu'en relation, espace de nommage (désigner, trouver les objets associés à des noms) et espace des objets sont distincts.

    Parfois nous confondons aussi "nom du chemin" et de l'objet, en fait, ils n'ont rien à voir!

    Le nom de l'objet est stocké dans l'attribut "__name__". Initialement, il est crée avec le même nom qui sera donné à la clé entré dans globals().
    Mais il peut être changé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> bar.__name__ = 'quux'
    >>> A.foo
    <function quux at 0x024FB198>
    sans que le comportement de l'objet "fonction" en soit affecté.

    La différence entre méthodes et fonctions se ramène à l'existence et au type du premier argument de la "fonction" lorsqu'elle sera appelée, au fait que la fonction soit "bound" ou pas avec un objet.

    Instancions A:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> a = A()
    >>> a.foo()
    <__main__.A object at 0x024FAA30>
    Le premier argument de la fonction sera l'objet instance de "A" qui aura servit à désigner la fonction.
    note: c'est la même fonction "foo", ce qui change c'est ce que fait l'interpréteur du contexte a.foo au moment de l'appel.

    Nous pourrions forcer "foo" à être méthode de classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> A.foo = classmethod(A.foo)
    >>> a.foo
    <bound method type.foo of <class '__main__.A'>>
    >>> a.foo()
    <class '__main__.A'>
    Dans ce cas, le premier argument sera la classe et non plus l'instance.

    => Une méthode un objet particulier réalisé en associant une fonction avec un objet "class" ou "instance".
    On peut la délier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> b = a.foo
    >>> obj = b.__self__
    >>> z = b.__func__
    >>> z(1,2,3)
    1, 2, 3
    Cela étant dit:
    Je voudrai lancer la fonction "func" à partir de la Class A.
    Est-ce possible ?
    On peut dire "yes we can"... mais désolé, pour moi, c'est du charabia

    Cordialement,
    - W

  5. #5
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    On peut dire "yes we can"... mais désolé, pour moi, c'est du charabia
    Ca le ferait bien en premiere ligne. Car j'etait deja dans un mini "dive into Python et puis... Rupture"

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Points : 62
    Points
    62
    Par défaut
    yes you can ... mais python n'aime pas forcement ,
    l'ordre de déclaration d’accès aux objets de class peut-être important , exemple si vous avez affaire à une classe imbriquée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class A (object) :
         def _ini_ (self...)
            ...
         Class B (object) :
            def _ini...
    la classe A ne peut pas appeler d'objet de la classe B dans le def par exemple car celle ci est inconnu
    pour ma part je 'nage' ou plutot rame avec la récuperation d'objet de la classe ...puré héritage et de liaison .. j'ai du mal à comprendre l'affectation que l'affection de nouvelle variable avec le resultat d'une fonction ne soit qu'une copie d'instance ...

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

    Quel problème cherchez vous a résoudre ?
    Est ce que des "nested classes" sont adaptées?
    Le fait est qu'on peut faire tomber le truc en marche (mais vous ne donnez pas assez de code).
    Si c'est juste pour le fun, il y a tellement de "drawbacks" que s'y acharner ne vaut peut être pas le coup.
    - W

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Points : 62
    Points
    62
    Par défaut
    Aucun problème , juste une réponse à la question posé qui se traduit par oui , ca dépend et le fils essaie d'eclairer le 'ça depend'

    un exemple d'appelle de class de meme niveau qui fonctionne ( en cours de debogage ) :Nom : classappeal..jpg
Affichages : 7571
Taille : 335,0 Ko

  9. #9
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Citation Envoyé par moons17 Voir le message
    la classe A ne peut pas appeler d'objet de la classe B dans le def par exemple car celle ci est inconnu
    Elle peut le faire mais pas n'importe comment.
    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
     
    class Foo(object):
        def __init__(self):
            print self.Baz.att_0
            try:
                print self.Baz.att_1
            except Exception as why:
                print why
            b = self.Baz()
            print "Attributs d'instance:"
            print b.att_0
            print b.att_1
     
        class Baz(object):
            att_0 = 'att_0'
            def __init__(self):
                self.att_1 = 'att_1'
     
    f = Foo()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    vincent@tiemoko:~/Bureau$ python nested.py 
    att_0
    type object 'Baz' has no attribute 'att_1'
    Attributs d'instance:
    att_0
    att_1
    un exemple d'appelle de class de meme niveau qui fonctionne ( en cours de debogage ) :classappeal..jpg
    Voilà qui me rappelle furieusement ceci:
    http://www.developpez.net/forums/d14...nction-classe/

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 57
    Points : 62
    Points
    62
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Elle peut le faire mais pas n'importe comment.

    Voilà qui me rappelle furieusement ceci:
    http://www.developpez.net/forums/d14...nction-classe/
    oui mon problème à moi reste entier dans le cas de l'exemple que j'ai linké ( un classe de gestion de fichier : autre partie du code du même programme )
    dans mon cas je bataille avec des passages de paramètre différent dans le nombre d’argument qui m’empêche de faire des appelle direct

    pour revenir à ton exemple :comment récupérer les attribut att_0 et att_1 depuis le core principal en dehors de la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     f = Foo.Baz()
    print (f.att_0)
    print (f.att_1)

  11. #11
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Citation Envoyé par moons17 Voir le message
    ... comment récupérer les attribut att_0 et att_1 depuis le core principal en dehors de la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     f = Foo.Baz()
    print (f.att_0)
    print (f.att_1)
    Exactement comme tu le fais. Fonctionne très bien, Python 2 et 3.

Discussions similaires

  1. Réponses: 17
    Dernier message: 16/07/2012, 14h10
  2. Renommer une fonction dans un select ou concevoir autrement une fonction
    Par tavarlindar dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 30/05/2008, 17h17
  3. Réponses: 2
    Dernier message: 20/06/2007, 12h12
  4. Appeler une nouvelle fenetre à partir d'une fonction callback
    Par foxyman dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 02/02/2007, 18h42
  5. Réponses: 2
    Dernier message: 01/11/2005, 18h47

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