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 fonction depuis une fonction


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Par défaut Appeler fonction depuis une fonction
    Bonjour à tous, alors voila je développe un petit jeu en python en utilisant Pygame et pour la première fois en python j'utilise les Class.

    Dans une fonction de ma class, je doit appeler une autre fonction (pas de problème normalement) mais depuis que j'ai englobé mes fonction dans une class j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        while 1: gererJeu(scrn, size, back)
    NameError: global name 'gererJeu' is not defined
    Alors que la fonction gererJeu est bien déclaré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while 1: gererJeu(scrn, size, back) # ici je donne la main à une nouvelle fonction
     
     
        def gererJeu(self, scrn, size, back):
    	# blablabla
    Voila, je ne comprend pas pourquoi je ne peux pas appeler ma fonction depuis une fonction dans une class avec des arguments ?

    Merci d'avance.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Guyome41 Voir le message
    Bonjour à tous, alors voila je développe un petit jeu en python en utilisant Pygame et pour la première fois en python j'utilise les Class.

    Dans une fonction de ma class, je doit appeler une autre fonction (pas de problème normalement) mais depuis que j'ai englobé mes fonction dans une class j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        while 1: gererJeu(scrn, size, back)
    NameError: global name 'gererJeu' is not defined
    Alors que la fonction gererJeu est bien déclaré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while 1: gererJeu(scrn, size, back) # ici je donne la main à une nouvelle fonction
     
     
        def gererJeu(self, scrn, size, back):
    	# blablabla
    Voila, je ne comprend pas pourquoi je ne peux pas appeler ma fonction depuis une fonction dans une class avec des arguments ?

    Merci d'avance.
    Salut
    Ta fonction gererJeu() est devenue une méthode de ta classe. Tu ne peux donc l'appeler qu'en l'associant à une variable du type de ta classe (on appelle ça "instance")
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class toto(object)
        def __init__(self, value):
            self.__value=value
     
        def affiche(self):
            print "La valeur est %d" % self.__value
    # toto
     
    var=toto(12)     # Création de la variable "var" de type "objet toto"
    var.affiche()      # Appel de la fonction affiche() pour la variable var

    C'est ça la programmation objet. Les outils de manipulation sont directement embarqués dans l'objet. Ca donne plus de granularité. Je pourrai par exemple créer une méthode "affiche" totalement différente mais associée à un objet "titi" je n'aurais pas à me casser la tête pour lui chercher un nom.

    Tu peux aussi appeler des méthodes dans d'autres méthodes. Faut juste les relier à l'élément "self" qui représente l'instance elle-même

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class toto(object)
        def __init__(self, value):
            self.__value=value
            self.affiche()
     
        def affiche(self):
            print "La valeur est %d" % self.__value
    # toto
     
    var=toto(12)     # Ici l'affichage se fait dans la création.

    Et si tu veux créer une méthode statique reliée à aucune instance mais juste à l'objet, alors il faut utiliser @staticmethod. Dans ce cas, la méthode n'étant reliée à aucune instance particulière ne possède pas de self mais reste reliée à l'objet et donc peut être appelée par toutes les instances de cet objet, voire même depuis l'objet lui-même

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class toto(object)
        @staticmethod
        def titre():
            print "Je suis un objet toto"
     
        def __init__(self, value):
            self.__value=value
    # toto
     
    a=toto(5)
    b=toto(18)
    a.titre()
    b.titre()
    toto.titre()
    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
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 117
    Par défaut
    Bonjour, merci pour ta réponse. Disons que j'ai l'habitude d'utiliser les class en VB.net qui est bien différent de python avec les self qui sont obligatoire pour chaque méthode des class.

    Je pensai que les instances se gérés dans la class

    Merci pour ton aide.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 : 4 060
    Par défaut
    les self qui sont obligatoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> class A:
    ...     def __init__(ce_que_je_veux, n):
    ...         ce_que_je_veux.n = n
    ...     def get(ce_que_je_veux):
    ...         return ce_que_je_veux.n
    ... 
    >>> a = A(5)
    >>> a.get()
    5
    Pas du tout, disons que c'est une convention, ça rend plus facilement lisible tout code python quand on s'aligne.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. appeler une fonction depuis S Fonction
    Par socrate88 dans le forum Simulink
    Réponses: 0
    Dernier message: 15/04/2011, 13h44
  3. [PHP 5.2] appeler une fonction depuis une autre en POO
    Par Haxor668 dans le forum Langage
    Réponses: 2
    Dernier message: 23/09/2009, 10h02
  4. Afficher la pile d'appel Tcl depuis une fonction C
    Par grismauve dans le forum Tcl/Tk
    Réponses: 0
    Dernier message: 19/09/2009, 10h22
  5. getattr() ? Appel d'une fonction depuis une fonction
    Par frites.saucisse dans le forum Général Python
    Réponses: 8
    Dernier message: 10/10/2008, 14h21

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