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 :

Erreur de class


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 25
    Par défaut Erreur de class
    Bonjour,

    Voici une partie de mon code:

    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
    class Bibliotheque(): 
        def __init__(self, capacite): 
            self.capacite = capacite
            self = []              # problablement l'erreur se trouve ici, il cherche la len de self qui la prend comme une fonction ??
     
        def afficherDocuments(self):
            print('\nAffichage de tous les ouvrages de la bibliotheque')
            for elt in self:
                print(elt)
     
        def document(self, i): 
            if i < len(self)-1:
                return self[i]
            else:
                return None
     
        def ajouter(self, elt):
            if self.capacite > len(self)+1 and isinstance(elt, Document):
                self.append(elt)
                return True
            return False
     
    if __name__ == "__main__":
        doc1 = Document(10001, "Rapport 2015 de la Cour des comptes")
     
        biblio = Bibliotheque(7)
        biblio.ajouter(doc1)
    et il me retourne cette erreur:

    Traceback (most recent call last):
    File "TP9.1.py", line 139, in <module>
    biblio.ajouter(doc1)
    File "TP9.1.py", line 85, in ajouter
    if self.capacite > len(self)+1 and isinstance(elt, Document):
    TypeError: object of type 'Bibliotheque' has no len()
    Pouvez vous me dire comment m'y prendre ?

    Merci d'avance.

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    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
     
    >>> class Biblio:
    ...     def __init__(self, c):
    ...             self.c = c
    ...             self = []
    ...             print("self:", self)
    ... 
    >>> b = Biblio(5)
    self: []
    >>> b.self
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Biblio' object has no attribute 'self'
    >>> b.c
    5
    Ça n'a franchement aucun sens ce que tu fais là, self représente l'instance de ta classe, tu ne peux pas utiliser ce terme comme nom (référence, variable, ou tout autre chose).

    Python remplace l'instance référencée par la liste créée mais comme ce self là n'est pas conservé en référence, il est aussitôt supprimé.

    Une autre façon de le voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    >>> class Biblio:
    ...     def __init__(self, c):
    ...             self.c = c
    ...             self = []
    ...             self.c += 1
    ... 
    >>> b = Biblio(5)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 5, in __init__
    AttributeError: 'list' object has no attribute 'c'
    Solutions, tu peux faire hériter la classe de list mais ça n'a d'intéret que si l'on veux en personnaliser le comportement en réimplémentant certaines méthodes de list ce qui ne semble pas être ton cas, soit tu fais de l'index de ta bibliothèque un attribut de la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Bibliotheque:
        def __init__(self, capacite):
            self.capacite = capacite
            self.livres = []
    et tu rajoutes .livres à tous les self isolés de ton code.

  3. #3
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Bonjour,
    +1: VinsS

    En fait:
    Emulating container types
    object.__len__(self)

    Called to implement the built-in function len(). Should return the length of the object, an integer >= 0. Also, an object that doesn’t define a __bool__() method and whose __len__() method returns zero is considered to be false in a Boolean context.
    Mais ce n'est pas très simple de tout régler.
    Une première approche:
    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
    >>> class A():
    	def __init__(self):
    		self.x = []
    		self.nb = 1
    	def plus(self):
    		self.nb += 1
    	def __len__(self):
    		return self.nb
     
     
    >>> a = A()
    >>> len(a)
    1
    >>> a.plus()
    >>> len(a)
    2
    >>>
    Clodion

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Citation Envoyé par Nyctophile Voir le message
    Pouvez vous me dire comment m'y prendre ?
    Lorsque vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def afficherDocuments(self):
            print('\nAffichage de tous les ouvrages de la bibliotheque')
            for elt in self:
                print(elt)
    ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def document(self, i): 
            if i < len(self)-1:
                return self[i]
            else:
                return None
    ou même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def ajouter(self, elt):
            if self.capacite > len(self)+1 and isinstance(elt, Document):
                self.append(elt)
                return True
            return False
    vous supposez très fortement que "self" est une instance de "list".

    Effectivement, transformer ce "self" en "list" via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def __init__(self, capacite): 
            self.capacite = capacite
            self = []              # problablement l'erreur se trouve ici, il cherche la len de self qui la prend comme une fonction ??
    ne fonctionne pas: il faut faire de Bibliotheque une sous classe de "list" en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Bibliotheque(list): 
        def __init__(self, capacite): 
            super().__init__()
            self.capacite = capacite
    note: comme suggéré dans les posts précédents, on peut aussi créer un attribut "documents" - la liste des documents - mettre à jour les méthodes déjà écrites pour prendre cette indirection en compte.

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

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 25
    Par défaut
    Merci tout le monde pour toutes vos réponses, desolé je suis pas assez avancé et j'essaye d'apprendre. Bonne soirée !

Discussions similaires

  1. [Upload] Problème pour gestion d'erreur avec class
    Par allserv dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2005, 13h00
  2. Erreur : La classe n'est pas enregistrée
    Par Le Pharaon dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/08/2005, 12h04
  3. [Débutant][JNDI] Erreur "bad class file"
    Par giffle dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 05/01/2005, 10h23
  4. Erreur : La classe ne gère pas Automation..
    Par Invité dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/09/2004, 10h24
  5. [FLASH MX 2004] message erreur de classe
    Par matN59 dans le forum Flash
    Réponses: 3
    Dernier message: 14/06/2004, 08h59

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