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 :

Problème création du méthode de classe [Python 3.X]


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Juin 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 89
    Points : 70
    Points
    70
    Par défaut Problème création du méthode de classe
    Bonjour,
    J'essaie de créer une classe qui comporte une méthode de classe.
    Voici le code de la création de la 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    class TableauNoir:        
        """Classe définissant une surface sur laquelle on peut écrire,
        que l'on peut lire et effacer, par jeu de méthodes. L'attribut modifié
        est 'surface'"""
     
        nb_TableauNoirs = 0
     
     
     
        def __init__(self):
            """Par défaut, notre surface est vide"""
            self.surface = ""
            nb_TableauNoirs += 1
     
        def ecrire(self, message_a_ecrire):
            """Méthode pour écrire sur le tableau"""
            """Si la surface n'est pas vierge, on saute une ligne"""
            if self.surface != "":
                self.surface += "\n"
            self.surface = self.surface + message_a_ecrire
     
        def lire(self):
            """Cette méthode se charge d'afficher, grâce à print,
            la surface du tableau"""
     
     
            print(self.surface)
     
        def effacer(self):
            """Cette méthode permet d'effacer la surface du tableau"""
            self.surface = ""
     
     
        def combien(cls):
             """Méthode de classe affichant combien d'objets ont été créés"""
            print("Jusqu'à présent, {} objets ont été créés.".format(cls.nb_TableauNoirs))
        combien = classmethod(combien)
    Le problème est que je lorsque j'importe la classe dans une fenêtre de commande python, j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "F:\Dropbox\python\Classes\mes_classes.py", line 54
        print("Jusqu'à présent, {} objets ont été créés.".format(cls.nb_TableauNoirs
    ))
     
      ^
    IndentationError: unindent does not match any outer indentation level
    Je ne comprends pas pourquoi il me sort une erreur d'indentation.

    J'ai déja eu des problème avec l'indentation et j'ai remplacé les tabulations par des espaces dans Notepad++. Si il reste un problème de ce type je ne vois pas ou il est.

    Allez-y doucement dans les explications, je débute en python
    Je joins le fichier de création de la classe en pièce jointe.

    Merci.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    moi aussi je suis débutant. Regarde bien ta dernière ligne de code
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    moi aussi je suis débutant. Regarde bien ta dernière ligne de code
    Certes mais l'erreur est générée par l'avant dernière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> def f():
    ...     '''comment lines
    ...     '''
    ...   z
      File "<stdin>", line 4
        z
        ^
    IndentationError: unindent does not match any outer indentation level
    >>>
    En python même les commentaires font partie du block, et doivent respecter l'indentation comme le reste.

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

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Juin 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 89
    Points : 70
    Points
    70
    Par défaut
    Merci, j'aurai pas pensé à regarder l'indentations des commentaires.

    J'arrive à importer la classe, mais lorsque j'essaie créer un objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> test = TableauNoir()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "E:\Dropbox\python\Classes\mes_classes.py", line 31, in __init__
        nb_TableauNoirs += 1
    UnboundLocalError: local variable 'nb_TableauNoirs' referenced before assignment
    Si je comprends bien il se plaint que j'utilise la variable nb_TableauNoirs avant qu'elle soit initialisée. Pourtant j'ai suivi le cours python il me semble.

    le boulet a encore besoin de vous.
    Encore merci.

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

    Ecrire:
    n'est pas une simple assignation.
    Ca équivaut à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        nb_TableauNoirs = nb_TableauNoirs + 1
    autrement dit une lecture de la variable "nb_TableauNoirs".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnboundLocalError: local variable 'nb_TableauNoirs' referenced before assignment
    Pour l'interpréteur cette variable n'est pas définie (et il a toujours raison!) dans l'espace "local" de la fonction.

    Comme vous avez écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class TableauNoir:        
        """Classe définissant une surface sur laquelle on peut écrire,
        que l'on peut lire et effacer, par jeu de méthodes. L'attribut modifié
        est 'surface'"""
     
        nb_TableauNoirs = 0
     
        def __init__(self):
            """Par défaut, notre surface est vide"""
            self.surface = ""
            nb_TableauNoirs += 1
    On peut supposer que vous vouliez incrémenter l'attribut de classe "nb_TableauNoirs" et non la variable.
    Un attribut de classe est dans l'espace de noms de la classe.
    Python ne peut pas le deviner si vous ne le désignez pas explicitement.
    Il faudrait écrire (par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           type(self).nb_TableauNoirs += 1
    Citation Envoyé par Toug19
    Si je comprends bien il se plaint que j'utilise la variable nb_TableauNoirs avant qu'elle soit initialisée.
    Variable locales/globales, attribut d'instance, de classe...
    Plus loin vous avez pourtant bien écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def combien(cls):
             """Méthode de classe affichant combien d'objets ont été créés"""
            print("Jusqu'à présent, {} objets ont été créés.".format(cls.nb_TableauNoirs))
        combien = classmethod(combien)
    Quelque part, vous devez apprendre a être plus rigoureux.
    Et vous pourrez lire 50 tutos, il n'y a que la pratique qui pourra y faire quelque chose.

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

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,

    nb_TableauNoirs est une variable de classe, c'est à dire qu'elle est commune à toutes les instances de la classe. Pour y accéder à l'intérieur ou à l'extérieur de la classe il faut la désigner par TableauNoir.nb_TableauNoirs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            self.surface = ""
            TableauNoir.nb_TableauNoirs += 1
    Ta variable va s'incrémenter à chaque fois que tu vas créer une instance de la classe.

    Si je raconte des bêtises corrigez moi
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Si je raconte des bêtises corrigez moi
    Techniquement il sera plus facile d'appeler attributs les noms qui suivent un ".".
    => variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             TableauNoir.nb_TableauNoirs += 1
    attribut de l'objet TableauNoir.
    note: "objet" => çà marche aussi si TableauNoir est module, fonction, instance, class,...

    Cela permet de les différencier d'une variable qui sera locale à une fonction ou globale à un module.
    Source: Python tutorial/scopes-and-namespaces

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

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Juin 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 89
    Points : 70
    Points
    70
    Par défaut
    Merci les gars!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/06/2008, 17h19
  2. Problème accès à une méthode d'un vecteur de classe
    Par sebdu94 dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/04/2008, 23h00
  3. Problème création New Java Class
    Par karl3i dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 09/01/2007, 08h17
  4. [Système] Problème avec les méthodes d'une classe
    Par oussama127 dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2006, 09h18
  5. [RMI] problème Création *_stub.class et *_skel.class
    Par philobedo dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 29/05/2006, 20h03

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