Partage
  • Partager sur Facebook
  • Partager sur Twitter

petit défi sur les décorateurs

Sujet résolu
    16 mai 2014 à 11:51:01

    bonjour,

    voici un petit challenge,j’espère que quelqu'un saura trouver ...ça m'aiderait bien...

    Soit un moteur de voiture , imaginons considéré comme froid de 0 à 45 ° , moyen de 46 à 70° , chaud de 71 à 90° et critique au-delà.

    le programme se passe en mode console et fait appel au module colorama pour mettre de la couleur dans la console

    le programme demande     "Voulez vous freiner(0) ou accélérer (1)   ?"

    l'écran se rafraîchit à chaque tour , et affiche la phrase ' vitesse  :  ',V, '   température du moteur :    ', T,'    état du moteur :     ',M

    Où V est la vitesse du véhicule, T est la température du moteur  et M retourne au choix   :  froid,moyen,chaud ou critique.

    On est au printemps et l'on démarre à température ambiante à 18°,au démarrage on est à v=0 km/h et chaque accélération l'augmente

    de 9 km.h et chaque freinage la baisse de 7 km/h.

    Il faudrait que M (donc: froid,moyen,chaud ou critique) change de couleur en fonction de l'état soit respectivement bleu,vert,jaune,rouge.

    Il faudrait UTILISER les décorateurs pour ce faire , c'est le but de l'exercice. exemple : @bleu,@vert...

    bonne chance !

    -
    Edité par buffalo974 16 mai 2014 à 11:54:17

    • Partager sur Facebook
    • Partager sur Twitter
      16 mai 2014 à 13:56:47

      Les décorateurs ne sont pas du tout adaptés dans ce cas de figure.

      Les décorateurs de Python sont statiques ils vont modifier une fonction pour toute l'exécution du programme, alors que l'état de ton moteur est dynamique : il va varier pendant l'exécution.

      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        16 mai 2014 à 18:06:54

        aïe...en effet c'est gênant.

        Je mets de côté le décorateur, mais que mettre à la place ?

        Je cherche un moyen de faire varier le comportement d'une fonction d'affichage en fonction de conditions.

        Et j'essaie de modulariser cela pour en faciliter la lecture et la maintenance.

        Ici il n'y a que 4 codes couleurs mais si il y en avait 100 ... Je sais pas comment faire.

        J'ai essayé ça mais le résultat est étrange , il me manque peut-être un "échappement"  :

        #!/usr/bin/python3
        # -*- coding: utf-8 -*-
        from os import system
        import os 
        from colorama import init, Fore, Back, Style
        
        init()
        os.system('cls')
        
        a = "Voici l'état du moteur :  "
        m = "critique"
        
        red = (Back.BLACK + Fore.RED + Style.NORMAL +a,m+ Back.RESET + Fore.RESET + Style.NORMAL )
        ... plein de code imaginaire...
        if ... :
        	print(red)



        -
        Edité par buffalo974 16 mai 2014 à 18:12:28

        • Partager sur Facebook
        • Partager sur Twitter
          16 mai 2014 à 19:32:16

          Bonjour,

          Je suis moi-même débutant en Python et ton exercice m’a l’air rigolo. Ce que j’ai fait est probablement inutilement compliqué, j’aimerai avoir l’avis de gens sur la question.

          from colorama import init, Fore, Back, Style
          from collections import namedtuple
          
          
          class Motor(object):
              State = namedtuple('State', 'range, status, color')
              possible_state = [
                      State((0 , 46),           'froid'   , Fore.BLUE   ),
                      State((46, 71),           'moyen'   , Fore.GREEN  ),
                      State((71, 91),           'chaud'   , Fore.YELLOW ),
                      State((91, float("Inf")), 'critique', Fore.RED    )  ]
              
          
              def __init__(self, speed = 0, temp = 18):
                  self.speed_ = speed
                  self.temp_ = temp
                  self.state = None
                  self.updateState()
          
                      
              def updateState(self):
                  for state in Motor.possible_state:
                      if state.range[0] <= self.temp < state.range[1]:
                          self.state = state
              
              @property
              def temp(self):
                  return self.temp_
              @temp.setter
              def temp(self, value):
                  self.temp_ = value
                  self.updateState()
                  
              @property
              def speed(self):
                  return self.speed_
              @speed.setter
              def speed(self, value):
                  self.speed_ = value
                  self.updateState()
          
              def accelerate(self):
                  self.speed += 9
                  return self
          
              def brake(self):
                  self.speed -= 7
                  if self.speed < 0:
                      self.speed = 0
                  return self
          
              def __str__(self):
                  s = 'vitesse : %s, temperature : %s, ' % (self.speed, self.temp)
                  return '<Motor> ' + s + self.state.color + self.state.status + Fore.RESET
          

          Je n’ai pas fais le main car c’est une simple boucle. Il faudrait également que la température évolue mais il n’y avait pas d’instruction la-dessus dans l’énoncé.

          EDIT : modification du code pour jouer avec les propriétés.

          -
          Edité par simbilou 16 mai 2014 à 20:27:08

          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoirbépocode minimal  — Ge0 <3
            16 mai 2014 à 21:27:30

            Rien à redire sur ton code, simbilou. J'aurais fait pareil.

            Juste une toute petite remarque sur les conventions : en principe pour un attribut "privé" on place l'underscore devant. Ça n'empêche personne d'y accéder (c'est voulu, "entre adultes consentants" tout ça...), mais si tu doubles cet underscore en préfixe, Python s' arrange alors pour mangler le nom de l'attribut pour qu'il ne soit plus directement manipulable de l'extérieur. Dans la pratique c'est très peu utilisé, mais ça renforce la sémantique de l'underscore en préfixe.

            Par ailleurs l'underscore post fixé est aussi utilisé, quand on veut éviter un name clash entre une variable et une builtin (genre file_, input_...).

            -
            Edité par nohar 16 mai 2014 à 21:36:26

            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              17 mai 2014 à 0:35:40

              nohar a écrit:

              Juste une toute petite remarque sur les conventions : en principe pour un attribut "privé" on place l'underscore devant […] Par ailleurs l'underscore post fixé est aussi utilisé, quand on veut éviter un name clash entre une variable et une builtin (genre file_, input_...).

              Erf, c’est mon habitude du C ou les identificateurs commençant par un underscore sont usuellement réservé à l’implémentation. Merci de l’avoir signalé, apprendre les bonnes pratiques fait parti du jeu.

              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoirbépocode minimal  — Ge0 <3

              petit défi sur les décorateurs

              × 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