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

Calcul scientifique Python Discussion :

Création d'une classe qui fait office de boite à messages


Sujet :

Calcul scientifique Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Création d'une classe qui fait office de boite à messages
    Bonjour à tous,

    Voici les consignes de l'exercice où je suis bloqué: "Créez une nouvelle classe, SMSStore. Avec cette classe vous pourrez instancier des objets SMSStore, qui peuvent stocker des messages SMS, similaire à une boîte de réception sur un téléphone:

    Ce store ou stockage peut contenir plusieurs messages SMS (son état interne sera juste une liste de messages). Chaque message sera représenté comme un tuple: (has_been_viewed, from_number, time_arrived, text_of_SMS). Une instance my_inbox de la classe SMSStore représentant une boîte de réception doit pouvoir comprendre les messages suivants:

    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
    my_inbox.add_new_arrival(from_number, time_arrived, text_of_SMS)
        # Crée un nouveau tuple SMS, ajouté après les autres
        # dans le stockage. Une fois créé, son attribut
        # has_been_viewed est mis à False.
     
    my_inbox.message_count()
        # Retourne le nombre de messages SMS dans my_inbox
     
    my_inbox.get_unread_indexes()
        # Retourne une list des indexes de tous les messages SMS encore non lus (not-yet-viewed)
     
    my_inbox.get_message(i)
        # Retourne (from_number, time_arrived, text_of_sms) pour le message[i]
        # Change aussi son état à "has been viewed".
        # S'il n'y a pas de message à la position i, retorune None
     
    my_inbox.delete(i)
        # Supprime le message SMS se trouvant à l'index i
     
    my_inbox.clear()
        # Supprime tous les messages SMS de cette boîte de réception
    Voici 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
    28
    29
    30
    31
    32
    33
    class SMSStore():
     
        def __init__(self):
            self.box=[]
     
        def get_unread_indexes(self):
            self.index=[]
            for k in self.box:
                if k[0] == False:
                    self.index.append(self.box.index(k))
            return(self.index)        
     
     
     
        def clear(self):
            self.box[:]=[]
     
        def add_new_arrival(self,from_number,time_arrived,text_of_SMS):
            self.text_of_SMS=text_of_SMS
            self.time_arrived=time_arrived
            self.from_number=from_number
            self.has_been_viewed=False
            self.box.append((self.has_been_viewed,self.from_number,self.time_arrived,self.text_of_SMS))
     
        def message_count(self):
            return(len(self.box))
     
        def get_message(self,i):
            if i <= (len(self.box) - 1):
                self.box[i][0] = True
                return(self.box[i][1:])
     
            return(None)
    Soyez indulgent, c'est mon premier exercice sur les classes en Python ! Cela fait depuis 4H que je bloques dessus en le modifiant plusieurs fois et finalement il m'a l'air parfait actuellement mais ne compile toujours pas correctement. Pouvez-vous m'aider à réparer les erreurs code ? Dernière question, comment faites-vous quand vous êtes bloqués comme cela pour vous en sortir ? Je veux dire par là, à mes premières relectures j'ai pu identifié quelques erreurs, maintenant j'ai beau relire mon code il me parait fonctionnel...

    Merci infiniment,

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Salut,

    Aucun problème pour compiler le bitcode chez moi.

    Si tu rencontres des erreurs d'exécution il est bien de copier-coller ici ces messages d'erreur.

    Je t'ai fait une mise au propre de ton 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #class SMSStore():
    class SMSStore:
        def __init__(self):
            self.box = []
     
        def get_unread_indexes(self):
            #self.index=[]
            indexes = []
            #for k in self.box:
            for idx, message in enumerate(self.box)
                #if k[0] == False:
                if not message[0]:
                    #self.index.append(self.box.index(k))
                    indexes.append(idx)
            return indexes       
     
        def clear(self):
            #self.box[:]=[]
            self.box = []
     
        def add_new_arrival(self,from_number,time_arrived,text_of_SMS):
            #self.text_of_SMS=text_of_SMS
            #self.time_arrived=time_arrived
            #self.from_number=from_number
            #self.has_been_viewed=False
            #self.box.append((self.has_been_viewed,self.from_number,
            self.box.append([False, from_number, time_arrived, text_of_SMS])
     
        def message_count(self):
            return len(self.box)
     
        def get_message(self,i):
            #if i <= (len(self.box) - 1):
            if i < self.message_count():
                self.box[i][0] = True
                return self.box[i][1:]
     
            #return(None)
            return
    Note que tes messages doivent être des listes et pas des tuples, tu ne pourrais pas modifier has_been_viewed.

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

    Citation Envoyé par KanielOutis Voir le message
    Pouvez-vous m'aider à réparer les erreurs code ?
    Vous avez d'abord un soucis de conception quant à définir quels sont les attributs qui définissent l'état de l'objet "boîte aux lettres". Dans la pratique, il y a bien trop de self.machin.

    Citation Envoyé par KanielOutis Voir le message
    Dernière question, comment faites-vous quand vous êtes bloqués comme cela pour vous en sortir ? Je veux dire par là, à mes premières relectures j'ai pu identifié quelques erreurs, maintenant j'ai beau relire mon code il me parait fonctionnel...
    Un code fonctionne lorsqu'il fait ce qu'on attend de lui!
    Ce qui veut dire définir des scenarii de tests et écrire encore du code pour tester que le code fonctionne comme on l'attend.

    note: ce qui vous aurait permis de détecter que get_message ne peut pas exécuter self.box[i][0] = True

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

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Aucun problème pour compiler le bitcode chez moi.

    Si tu rencontres des erreurs d'exécution il est bien de copier-coller ici ces messages d'erreur.

    Je t'ai fait une mise au propre de ton 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #class SMSStore():
    class SMSStore:
        def __init__(self):
            self.box = []
     
        def get_unread_indexes(self):
            #self.index=[]
            indexes = []
            #for k in self.box:
            for idx, message in enumerate(self.box)
                #if k[0] == False:
                if not message[0]:
                    #self.index.append(self.box.index(k))
                    indexes.append(idx)
            return indexes       
     
        def clear(self):
            #self.box[:]=[]
            self.box = []
     
        def add_new_arrival(self,from_number,time_arrived,text_of_SMS):
            #self.text_of_SMS=text_of_SMS
            #self.time_arrived=time_arrived
            #self.from_number=from_number
            #self.has_been_viewed=False
            #self.box.append((self.has_been_viewed,self.from_number,
            self.box.append([False, from_number, time_arrived, text_of_SMS])
     
        def message_count(self):
            return len(self.box)
     
        def get_message(self,i):
            #if i <= (len(self.box) - 1):
            if i < self.message_count():
                self.box[i][0] = True
                return self.box[i][1:]
     
            #return(None)
            return
    Note que tes messages doivent être des listes et pas des tuples, tu ne pourrais pas modifier has_been_viewed.
    Bonjour et merci infiniment pour ta réponse,

    Un grand merci pour ton code même si je ne vais pas l'utiliser entièrement (car tu utilises des fonctions que je n'ai jamais utilisé, enumerate() ? ) mais je le prend en considération pour la mise au propre.

    Au niveau de la méthode get_unread_indexes(self), si j'ai bien compris un principe : on définit la variable index au niveau de la méthode qui sera détruit automatiquement après l'appel de la méthode. Tandis que dans mon code de départ en utilisant self.index = [] , je définis un nouvel attribut pour mon instance de classe qui elle sera permanente (jusqu'à modification du moins). J'aurais pu utiliser self.index=[] en tenant compte que l'instance de classe disposera de ce nouvel attribut et à la fin de la méthode remettre cet attribut à zéro en faisant self.index=[].

    Dans ce cas il est clair que définir une variable local à la méthode get_unread_indexes(self) qui sera détruit après l'appel de la méthode est beaucoup plus efficace. C'est bien ça ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Vous avez d'abord un soucis de conception quant à définir quels sont les attributs qui définissent l'état de l'objet "boîte aux lettres". Dans la pratique, il y a bien trop de self.machin.



    Un code fonctionne lorsqu'il fait ce qu'on attend de lui!
    Ce qui veut dire définir des scenarii de tests et écrire encore du code pour tester que le code fonctionne comme on l'attend.

    note: ce qui vous aurait permis de détecter que get_message ne peut pas exécuter self.box[i][0] = True

    - W
    Bonjour Wiztricks,

    Merci énormément de prendre toujours du temps pour répondre à mes sujets (cf l'exercice du dés posté récemment), il est clair que j'ai un soucis de conception et de compréhension au niveau du self. Notre professeur se contente de nous donner le livre de Gerard Swinnen et un tas d'exercice pour l'examen et cela s'arrête là. Niveau explication, j'ai seulement eu droit à : pose pas trop de question, des que tu crées une classe tu mets self et puis c'est tout. Vulgairement dit c'était un peu ça.

    Du coup j'ai regardé des vidéos sur le net sur le sujet et je pense enfin avoir compris (du moins partiellement compris, maitriser vraiment quelque chose c'est différent) la différence entre attribut d'instance et attribut de classe. Cependant je n'ai toujours pas saisi comment tester son code ? Ce qu'on m'a appris à faire c'est une fois que le code a un soucis, c'est le copier sur python tutor et voir ce qui crée l'erreur en question. Est ce une bonne méthode ?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    J'ai modifié mon code en incluant aussi des commentaires (une bonne habitude à prendre).

    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
    class SMSStore():
     
        def __init__(self):    #Méthode constructeur pour attribuer à chaque instance sa boite de réception
            self.box=[]
     
        def clear(self):      #Méthode qui permet de vider la liste de l'instance de classe
            self.box=[]
     
        # Méthode qui prend trois argument et crée une variable has_been_viewed avec False comme valeur de base. Ensuite j'ajoute à la liste box de l'instance de classe une liste contenant la variable has_been_viewed avec sa valeur False et un tuple contenant les 3 paramètres
        def add_new_arrival(self,from_number,time_arrived,text_of_SMS):
            has_been_viewed = False
            self.box.append([has_been_viewed,(from_number,time_arrived,text_of_SMS)])
     
        def message_count(self):    #Méthode qui retourne le nombre de sous liste (SMS) de notre liste box de l'instance de classe
            return(len(self.box))
     
        def get_message(self,i): #Méthode qui prend en argument un chiffre qui sera l'index, ensuite on vérifie que l'index est bien présent dans la liste.Si oui,modification de la sous-liste situé à l'index i dans la liste box de notre instance de classe en modifiant la première valeur de cette sous-liste (la variable has_been_viewed) par True. On retourne ensuite le tuple qui est situé à la deuxieme position de notre sous-liste. Si l'index i n'est pas dans la liste on retourne rien
            if i < self.message_count():
                self.box[i][0] = True
                return(self.box[i][1])
            else:
                return()
     
        def get_unread_indexes(self): #Méthode qui crée une liste vide et parcourt la liste box de notre instance de classe. Elle regarde la première valeure de chaque sous liste situé dans la liste box, si cette valeur est false on ajoute l'index de cette sous-liste à notre liste vide (variable local). On retourne ensuite la liste index
            index=[]
            for k in self.box:
                if k[0]==False:
                    index.append(self.box.index(k))
            return(index)
     
    p1 = SMSStore()
    p1.add_new_arrival('048647777','10:00','Je suis là')
    print(p1.get_unread_indexes())
    print(p1.get_message(0))
    Dans ma console j'obtiens bien l'index et le tuple de cet index, simplement au niveau de la plateforme de l'exercice j'obtiens un message d'erreur :
    Failed test:
    Tuples differ: ('0478123456', '10:50', 'Almost there') != ()

    First tuple contains 3 additional elements.
    First extra element 0:
    '0478123456'

    - ('0478123456', '10:50', 'Almost there')
    + () : You're inbox doesn't return the right third sms after addition of 3 sms.

    Failed test:
    False is not true : You did not provide the requested methods.

    ----------------------------------------------------------------------
    Ran 5 tests in 0.001s

    FAILED (failures=2, errors=1)

    Merci infiniment

  7. #7
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Là il faudra montrer le code du script de test.

    À ma connaissance ça ne ressemble pas aux logs de unittest ...

  8. #8
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Extrait des consignes de l'exercice :

    Chaque message sera représenté comme un tuple: (has_been_viewed, from_number, time_arrived, text_of_SMS)
    et vous vous écrivez :

    def add_new_arrival(self,from_number,time_arrived,text_of_SMS):
    has_been_viewed = False
    self.box.append([has_been_viewed,(from_number,time_arrived,text_of_SMS)])
    Autrement dit, votre classe peut très bien être fonctionnel, mais vous ne respectez pas le format des données stipulé dans la consigne.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci d'avoir pris de votre temps pour répondre à mon sujet. Le soucis étant que si j'ajoute le message dans la boxe sous forme d'un tuple, je ne pourrais par la suite plus modifier le premier élément "has been viewed" pour le mettre à True avec la méthode get_message ?

  10. #10
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Effectivement vous ne pouvez pas modifier directement le 1er élément du tuple, mais vous pouvez tout de même vous en sortir !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    un_tuple = (1,2,3)
    #un_tuple[0] = 7 ### n'est pas permis
    un_tuple = (7, un_tuple[1], un_tuple[2])  ## Fait l'affaire
    un_tuple = (7,) un_tuple[1:]  ## Fait aussi l'affaire
    Dans ce genre d'exo, il faut respecter scrupuleusement les consignes, sinon le code marche, mais à coup sûr, vous ne passez pas les tests !

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/05/2010, 17h51
  2. [POO] Une classe qui fait tout ?
    Par Nasky dans le forum Langage
    Réponses: 23
    Dernier message: 26/05/2006, 21h02
  3. [SQL] une requete qui fait mal a la tete
    Par MailOut dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/02/2005, 17h22
  4. Réponses: 14
    Dernier message: 09/04/2004, 14h44
  5. destruction d'une classe qui herite de CDialog
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 03/02/2004, 18h39

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