Partage
  • Partager sur Facebook
  • Partager sur Twitter

Creation d'une classe de collection d'objets

Class Tache() dependante de Class ToDoListe()

    29 mai 2019 à 18:49:22

    Bonjour!

    Je suis encore bien debutant en python et en programmation en generale, et je rencontre le probleme suivant dans un defi personnel ou je veux creer des to do listes qui ont chacune des taches qui elles meme ont chacune differentes characteristiques (texte descriptif, timestamp de creation, indice de priorite, deadline).  Etant un exercice d'entrainement l'arrivee m'importe peu, c'est le chemin qui m'interresse vraiment. 

    Je vous decrit ce que j'essaye de faire puis je joint mon code :

    J'essaye de:

    1. Creer une classe ToDo() que l'utilisateur peut appeler pour creer une nouvelle liste ToDo. Lors de l'instanciation d'une liste je veux creer une liste (self.liste_tache[] ) qui contiendra les objets tache et un compteur_tache qui indiquera le nombre de taches presentes dans la toDo

    2. Creer une sous classe "tache" dont chaque instanciation sera une nouvelle tache obligatoirement liee a une instance de toDO

    Je voudrais donc qu'a chaque instanciation d'une nouvelle tache, le compteur de la liste ToDo dont la tache fait partie s'incremente de 1, et que l'objet Tache soit ajoute a la liste ToDo dont il depend.

    Le soucis c'est que dans l'initialisation de ma classe Tache(), il semble que les deux lignes suivantes ne fonctionnent pas.

    toDo.compteur_taches += 1
    
    toDo.liste_tache.append(self)


    En effet, le code suivant (se referer au code entier plus bas)

    liste = toDo()

    tache1 = liste.tache("chercher du pain")

    renvoie l'erreur

    AttributeError: type object 'toDo' has no attribute 'compteur_taches

    Quel serait le moyen de faire marcher cette logique? Ou quelle meilleure logique appliquer? 

    Le code

    import time
    
    class toDo :
    
      def __init__(self):
        self.liste_tache = []
        self.compteur_taches = 0
        
      class tache:
        def __init__(self, nouvelle_tache, deadline = None):
      
          self.tache = nouvelle_tache
          self.status = "a faire"
          self.date_enregistrement = time.time()
          self.classement = toDo.compteur_taches
          self.deadline = deadline
          toDo.compteur_taches += 1
          toDo.liste_tache.append(self)              # on ajoute l'objet a la liste toDo      
        
        def initialisation(self):
          toDo.liste_tache.append(self)
        
        def supp_tache(self):
          toDo.liste_tache.remove(self)  
          del (self)
            
      
    # --- Code principal
    
    liste = toDo()
    print(liste.liste_tache) # Cette partie fonctionne
    tache1 = liste.tache("chercher du pain") #Erreur a partir de cette partie



    Merci de votre aide!

    • Partager sur Facebook
    • Partager sur Twitter
      31 mai 2019 à 17:09:06

      Ton compteur est dans la classe ToDo alors que tu essaie d'y acceder dans la classe tache.
      • Partager sur Facebook
      • Partager sur Twitter
        30 juillet 2019 à 11:57:11

        Au final j'ai legerement change l'approche et j'ai un code qui fonctionne desormais

        # --- Declaration des classes
        
        import time
        
        class ToDo :
        
            compteur_ToDo = 0
        
        # --- Fonction d'initialisation d'une liste ToDo
        
          def __init__(self, name = None):  
            
            self.name = name
            self.compteur_taches_a_realiser = 0                                           # Compteur qui va nous permmettre de compter les taches non realisees presentes dans la ToDO
            self.dic_taches = {}                                                          # Dictionnaires qui va contenir les objets Taches et nous permettre d'y acceder facilement
            ToDo.compteur_ToDo += 1
            if (self.name == None) :                                                      # Il n'est pas possible d'integrer ToDo.compteur_ToDo dans le def __init__ pour l'affecter par defaut
              self.name = "ToDo liste {}".format(str(ToDo.compteur_ToDo))                 # a name. Pour contourner cela, on donne None comme valeur par defaut a name, ce qui donne le choix a l'utilisateur
                                                                                          # de choisir un nom de liste ou non, et dans le corps de __init__ on fait une condition pour definir
                                                                                          # le nom par defaut en tant que ToDo liste numero compteur_ToDo
        
        # --- Fonction de creation d'une nouvelle tache
        
          def nouvelle_tache(self,nouvelle_tache, deadline = None):
            self.compteur_taches_a_realiser += 1                                          # on increment le compteur de taches de la ToDo
            if self.dic_taches.get(nouvelle_tache) != None:
              print("la tache '{}' existe deja dans la ToDo '{}'".format(nouvelle_tache , self.name))
            else:
              self.dic_taches[nouvelle_tache] = tache(nouvelle_tache, len(self.dic_taches) + 1, deadline)  # on cree une entree dans le dictionnaire avec comme indice nouvelle_tache et comme entree un objet tache
              print("la tache '{}' a bien ete ajoutee dans la ToDo '{}'".format(nouvelle_tache , self.name))
              
        # --- Fonction de changement de status d'une tache, de "a faire" a "tache completee" ou inversement       
              
              
          def change_status(self, tache_a_changer):
            if self.dic_taches[tache_a_changer].status == "a faire":
              self.dic_taches[tache_a_changer].status = "tache completee"
              self.compteur_taches_a_realiser -= 1
              print("le status de la tache '{}'' a ete change en 'tache completee'")
        
            else:
              self.dic_taches[tache_a_changer].status = "a faire"
              self.compteur_taches_a_realiser += 1
              print("le status de la tache '{}' a ete change en 'a faire'")
              
              
        # --- Fonction de suppression d'une tache     
              
          def supp_tache(self, tache_a_supprimer):
            if self.dic_taches.get(tache_a_supprimer) == None:                            # utilisation du get qui permet de renvoyer None si la cle n'existe pas tandis que dic_tache[cle] renvoie une erreur
              print("la tache '{}' que vous voulez supprimer est inexistante dans la ToDo '{}'".format(tache_a_supprimer, self.name))
            else:
              if input("etes vous surs de vouloir supprimer la tache '{}'?\n enter 'o' pour confirmer, ou entree pour annuler".format(tache_a_supprimer)).lower() == "o":
                for tache in self.dic_taches:
                  if self.dic_taches[tache].indice_priorite > self.dic_taches[tache_a_supprimer].indice_priorite:                   # Avant de supprimer, on diminue de 1 les indices de priorite de toutes les taches moins prioritaires
                    self.dic_taches[tache].indice_priorite -= 1
                del(self.dic_taches[tache_a_supprimer])                                   # Une fois les indices de priorite mis a jour on supprime l'entree dans le dictionnaires des taches
                self.compteur_taches_a_realiser -= 1                                      # On diminue le compteur de taches a realiser
                print("la tache '{}' a bien ete retiree de la ToDo '{}'".format(tache_a_supprimer , self.name))
        
          def affiche_tri_priorite(self):
            if self.dic_taches != {}:
              dic_tri_par_priorite = sorted(self.dic_taches.items(), key=lambda t: t[1].indice_priorite)        #Affecte une liste de tuples (key,[valeurs]) a dico_tri_par_deadline trie sur la valeur deadline
              num=0
              for clefs , valeurs in dic_tri_par_priorite:
                num += 1
                print("{num} - Tache : {clef} - statut : {status} - deadline : {deadline}".format(num = num, clef = clefs, status = self.dic_taches[clefs].status, 
                                                                                                  deadline = self.dic_taches[clefs].deadline))
        
            
         
        class tache:
        
          def __init__(self, nouvelle_tache, indice_priorite, deadline = None):
            self.tache = nouvelle_tache
            self.status = "a faire"
            self.date_enregistrement = time.time()
            self.indice_priorite = indice_priorite
            self.deadline = deadline



        • Partager sur Facebook
        • Partager sur Twitter

        Creation d'une classe de collection d'objets

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown