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 méthode depuis une "classmethod"


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Points : 366
    Points
    366
    Par défaut Appeler une méthode depuis une "classmethod"
    Salut à tous,

    Un exemple vaut mieux qu'un long discours :
    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
    class Bidule:
     
        attr = "123"
     
        def __init__(self):
            print "fonction init"
     
        @classmethod
        def classmet(cls):
            print "fonction classmet", cls.attr
            cls.machintruc()   # problème ici
     
        def machintruc(self):
            print "fonction machintruc", self.attr
     
    Bidule().machintruc()   # OK
    print "---"
    Bidule.classmet()   # erreur  :(

    J'ai une classe "Bidule" dont la classmethod "classmet" doit appeler la méthode "machintruc", sauf que ça marche pas. L'erreur renvoyée est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "essai.py", line 18, in <module>
        Bidule.classmet()
      File "essai.py", line 11, in classmet
        cls.machintruc()
    TypeError: unbound method machintruc() must be called with Bidule instance as first argument (got nothing instead)

    Savez-vous ce qui ne va pas ?


    Merci d'avance


    -

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Une classmethod reçoit comme premier argument la classe (soit le type), et non une instance. Tu essayes ensuite d'appeler machintruc dessus.
    Ca revient à faire Bidule.machintruc(), ce qui n'a aucun sens.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Points : 366
    Points
    366
    Par défaut
    Ah oui, je comprends mieux...

    Du coup ça m'arrange pas car il va falloir que je réécrive ma classe autrement


    Merci pour l'aide


    -

  4. #4
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Non, pas spécialement.
    Si je comprends bien ce que tu veux faire, il te suffirait de déclarer machintruc comme étant statique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @staticmethod
    def machintruc():
        print(Bidule.attr)

  5. #5
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Points : 366
    Points
    366
    Par défaut
    Oui et non

    Le problème avec staticmethod, c'est que ma fonction "machintruc" utilise l'attribut "attr" qui est susceptible d'être modifié, car en fait "classmet" doit pouvoir aussi être appelée depuis une instance de Bidule => "Bidule.attr" est à éviter.

    Et si je mets "machintruc" en classmethod, ça pose aussi problème car si "attr" est modifié dans "machintruc" (donc en l'occurrence "cls.attr"), alors cette valeur deviendra celle par défaut de toute nouvelle instance de classe Bidule au lieu de "123" dans mon exemple.


    Bref, j'ai programmé ma classe comme un cochon, donc je vais revoir tout ça.

    Merci quand même

    -

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

Discussions similaires

  1. Accès à une méthode d'une form depuis une autre autre form
    Par arngrimur dans le forum Windows Forms
    Réponses: 16
    Dernier message: 13/01/2012, 15h45
  2. Réponses: 2
    Dernier message: 02/08/2011, 17h03
  3. Réponses: 6
    Dernier message: 29/04/2008, 09h34

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