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 :

Comment appeler une méthode d'une classe ?


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 179
    Par défaut Comment appeler une méthode d'une classe ?
    Bonjour !

    Je n'arrive pas à faire tirer un vaisseau en appelant sa méthode Tire(0)

    J'ai l'erreur : La classe Vehicule (dont est issu le vaisseau) n'a pas de méthode Tire()

    AttributeError: 'Vehicule' object has no attribute 'Tire'

    La classe est celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Vehicule() :
        def _init_(self, Nom, Position, Attaque, Resistance, Vitesse)
            self.Nom=Nom
            self.Position=Position
            self.Attaque=Attaque
            self.Resistance=Resistance
            self.Vitesse=Vitesse
     
            self.Missiles=[] # Stock des missiles du vaisseau.
     
            def Tire(self, arme) :
                if arme == 0 :
                    self.Missiles.append(py.Rect(self.Position[0]+10,self.Position[1],8,8))

    J'appelle la méthode en passant par l'instance MonVaisseau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MonVaisseau = Vehicule()
     
    MonVaisseau.Tire(0)
    Je voudrais que ce soit le vaisseau qui ait cette méthode tire et non la classe Vehicule. Et surtout pouvoir l'appeler.

  2. #2
    Rédacteur/Modérateur


    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 710
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    En Python, l'indentation sert à définir la structure et la hiérarchie du code.

    Dans une classe, il faut indenter le code comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MyClass:
        """A simple example class"""
        i = 12345
     
        def __init__(self, name):
            self.name = name
     
        def f(self):
            return 'hello world'
    Dans votre cas :

    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 pygame as py  
     
    class Vehicule:
     
        def __init__(self, nom, position, attaque, resistance, vitesse):
            # ↑ Ajout des doubles underscores et du ":" à la fin
            self.nom =nom
            self.position = position  # Doit être une liste ou un tuple [x, y]
            self.attaque = attaque
            self.resistance = resistance
            self.vitesse = vitesse
     
            self.missiles = []  # Stock des missiles du vaisseau.
     
        # Alignement des méthodes commençant par def
        def tire(self, arme):
            if arme == 0:
                # Crée un rectangle pour le missile, puis ajout à la liste
                self.missiles.append(py.Rect(self.position[0] + 10, self.position[1], 8, 8))

    Cela dit je n'ai pas testé et il faut voir aussi l'initialisation des paramètres de la classe

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  3. #3
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 179
    Par défaut
    Merci pour ta réponse !
    Je ne vois pas comment faire car je ne vois pas où est le problème dans mon indentation :/

    Par contre, merci tu m'as fait remarquer le double underscore !

    Mais en les mettant, le programme demandera les paramètres dés la création de l'instance MonVaisseau, alors que moi je voudrais pouvoir créer d'abord cette instance et ensuite lui attribuer les parametres avec par exemple MonVaisseau.vitesse = [5,5]

    Edit :

    J'ai rectifié le underscore et j'ai aligné tous les def sous la classe, mais cela signifie que Tire() appartient à la classe et moi je voudrais que Tire() appartienne seulement au vaisseau.
    En tous cas, à l'execution, le programme me dit :

    TypeError: Vehicule.Tire() missing 1 required positional argument: 'arme'

    Quand je fais : MonVaisseau.Tire(0)

  4. #4
    Rédacteur/Modérateur


    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 710
    Billets dans le blog
    67
    Par défaut
    Citation Envoyé par nouby Voir le message
    ...
    Mais en les mettant, le programme demandera les paramètres dés la création de l'instance MonVaisseau, alors que moi je voudrais pouvoir créer d'abord cette instance et ensuite lui attribuer les parametres avec par exemple MonVaisseau.vitesse = [5,5]
    Oui mais Il faut bien initialiser ces paramètres au moment d'exécuter la méthode __init__ pour définir ces attributs de classe :

    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 Vehicule:
     
        def __init__(self):
            # On initialise les variables "à vide"
            self.nom = None
            self.position = [0, 0]  # Une position de départ par défaut
            self.attaque = 0
            self.resistance = 0
            self.vitesse = [0, 0]
     
            self.Missiles = []
     
        # Alignement des méthodes commençant par def
        def tire(self, arme):
            if arme == 0:
                # Crée un rectangle pour le missile, puis ajout à la liste
                self.missiles.append(py.Rect(self.position[0] + 10, self.position[1], 8, 8))
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 179
    Par défaut
    Merci beaucoup !
    J'ai appris un super truc là

    Il me reste à régler ce problème de arme.

  6. #6
    Rédacteur/Modérateur


    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 710
    Billets dans le blog
    67
    Par défaut
    Je voudrais que ce soit le vaisseau qui ait cette méthode tire et non la classe Vehicule.[/B] Et surtout pouvoir l'appeler.
    Donc si tous les véhicules ne tirent pas, Vehicule est plus général que Vaisseau, il faut utiliser l'héritage : La classe Vaisseau hérite des propriétés et méthodes de la classe Vehicule et contient en plus la méthode tire :

    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
    class Vehicule:
     
        def __init__(self):
            # On initialise les variables "à vide"
            self.nom = None
            self.position = [0, 0]  # Une position de départ par défaut
            self.attaque = 0
            self.resistance = 0
            self.vitesse = [0, 0]
     
     
        def avancer(self):
            # Tous les véhicules, quels qu'ils soient, peuvent avancer
            self.position[1] -= self.vitesse[1]
     
     
    class Vaisseau(Vehicule):
     
        def __init__(self):
            # On récupère la base de Vehicule
            super().__init__()
            # On ajoute le stockage des munitions propre au vaisseau
            self.missiles = []
     
        def tire(self, arme):
            # Seul le vaisseau peut tirer
            if arme == 0:
                self.missiles.append(py.Rect(self.position[0] + 10, self.position[1], 8, 8))
    Il faut voir les attributs précis au niveau des deux classes..je connais pas trop les détails
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  7. #7
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 179
    Par défaut
    Oui, merci, c'est ce que je veux obtenir, mais je ne sais pas comment.

    Et j'ai ajouté l'attribut :

    self.Image=
    self.Rect=self.Image.get_rect()

    Mais je ne sais pas quoi mettre comme attribut par défaut car les vehicules n'ont pas une image par défaut, c'est à la création de l'instance que je le décide.

    EDIT :
    Comme attribut par défaut pour l'image, j'ai simplement supprimé cet attribut dans la classe et je l'ai ajouté lors de la création de l'instance. C'est OK !
    Pour le moment mon programme fonctionne bien, il me reste à créer ce truc d'héritage de classe afin que Tire() appartienne seulement à l'instance MonVaisseau.
    Mais je ne sais pas comment faire ça.

  8. #8
    Rédacteur/Modérateur


    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 710
    Billets dans le blog
    67
    Par défaut
    J'ai corrigé le code de mon dernier message, ensuite vous pouvez faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mon_vaisseau = Vaisseau()
    mon_vaisseau.nom = "Vaisseau1"
    #...
    mon_vaisseau.position = [50, 100]  # Position de départ
    mon_vaisseau.tire(0)
    EDIT:
    Attention j'ai mis tous les noms des attributs et des méthodes en minuscules.
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  9. #9
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 179
    Par défaut
    Merci beaucoup, j'ai copié, je vais y réfléchir ce soir, là je sature

  10. #10
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 179
    Par défaut
    Merci beaucoup pour ton aide, j'ai appris beaucoup de choses, sur la classe et l'héritage, quand j'ai analysé ton code !
    je mets en résolu.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/08/2010, 22h50
  2. comment appeler une classe java dans une page jsp?
    Par limalima dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 21/11/2008, 22h59
  3. Réponses: 2
    Dernier message: 26/11/2007, 12h22
  4. Réponses: 6
    Dernier message: 25/04/2007, 18h07
  5. Réponses: 2
    Dernier message: 31/08/2005, 16h12

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