Aller au contenu

La classe Chien⚓︎

On souhaite dans cet exercice créer une classe Chien ayant deux attributs :

  • un nom nom de type str,

  • un poids poids de type float.

Cette classe possède aussi différentes méthodes décrites ci-dessous (chien est un objet de type Chien) :

  • chien.donne_nom() qui renvoie la valeur de l'attribut nom ;

  • chien.donne_poids() qui renvoie la valeur de l'attribut poids ;

  • chien.machouille(jouet) qui renvoie son argument, la chaine de caractères jouet, privée de son dernier caractère ;

  • chien.aboie(nb_fois) qui renvoie la chaine 'Ouaf' * nb_fois, où nb_fois est un entier passé en argument ;

  • chien.mange(ration) qui modifie l'attribut poids en lui ajoutant la valeur de l'argument ration (de type float).

classDiagram
class Chien{
       nom : str
       poids : float
       donne_nom() str
       donne_poids() float
       machouille(jouet : str) str
       aboie(nombre : int) str
       mange(ration : float) bool
}

On ajoute les contraintes suivantes concernant la méthode mange :

  • on vérifiera que la valeur de ration est comprise entre 0 (exclu) et un dixième du poids du chien (inclus),
  • la méthode renverra True si ration satisfait ces conditions et que l'attribut poids est bien modifié, False dans le cas contraire.
Exemples
🐍 Console Python
>>> medor = Chien('Médor', 12.0)
>>> medor.donne_nom()
'Médor'
>>> medor.donne_poids()
12.0
>>> medor.machouille('bâton')
'bâto'
>>> medor.aboie(3)
'OuafOuafOuaf'
>>> medor.mange(2.0)
False
>>> medor.mange(1.0)
True
>>> medor.donne_poids()
13.0
>>> medor.mange(1.3)
True

Compléter le code de la classe Chien.

###
# Tests publicsbksl-nlmedor = Chien("Médor", 12.0)bksl-nlassert medor.donnepy-undnom() == "Médor"bksl-nlassert medor.donnepy-undpoids() == 12.0bksl-nlassert medor.machouille("bâton") == "bâto"bksl-nlassert medor.aboie(3) == "OuafOuafOuaf"bksl-nlassert medor.mange(2.0) == Falsebksl-nlassert medor.mange(1.0) == Truebksl-nlassert medor.donnepy-undpoids() == 13.0bksl-nlassert medor.mange(1.3) == Truebksl-nlbksl-nl# Tests secretsbksl-nltoutou = Chien("toutou", 10.0)bksl-nlassert toutou.donnepy-undnom() == "toutou", "Erreur sur la méthode donnepy-undnom"bksl-nltoutou.nom = "Toutou"bksl-nlassert toutou.donnepy-undnom() == "Toutou", "Attribut mal nommé"bksl-nlassert toutou.donnepy-undpoids() == 10.0, "Erreur sur la méthode donnepy-undpoids"bksl-nlprint("Tests du constructeur passés avec succès")bksl-nltoutou.poids = 11.0bksl-nlassert toutou.donnepy-undpoids() == 11.0, "Attribut mal nommé"bksl-nlassert toutou.machouille("balle") == "ball", "Erreur sur la méthode machouille"bksl-nlassert toutou.machouille("") == "", "Erreur sur la méthode machouille"bksl-nlprint("Tests de la méthode 'machouille' passés avec succès")bksl-nlassert toutou.aboie(30) == "Ouaf" py-str 30, "Erreur sur la méthode aboie"bksl-nlassert toutou.aboie(0) == "", "Erreur sur la méthode aboie"bksl-nlprint("Tests de la méthode 'aboie' passés avec succès")bksl-nlassert not toutou.mange(-1.0), "Erreur sur la méthode mange"bksl-nlassert not toutou.mange(11.0), "Erreur sur la méthode mange"bksl-nlassert not toutou.mange(0.0), "Erreur sur la méthode mange"bksl-nlassert toutou.mange(1.1), "Erreur sur la méthode mange"bksl-nlassert toutou.donnepy-undpoids() == 12.1, "Erreur sur la méthode mange"bksl-nlprint("Tests de la méthode 'mange' passés avec succès")bksl-nlbksl-nl 5/5

class Chien:bksl-nl def py-undpy-undinitpy-undpy-und(self, nom, poids):bksl-nl self.... = nombksl-nl self.... = poidsbksl-nlbksl-nl def donnepy-undnom(self):bksl-nl return self....bksl-nlbksl-nl def ...(self):bksl-nl return self....bksl-nlbksl-nl def machouille(self, jouet):bksl-nl resultat = ""bksl-nl for i in range(...):bksl-nl resultat += jouet[...]bksl-nl return ...bksl-nlbksl-nl def ...(self, ...):bksl-nl ...bksl-nlbksl-nl def ...(self, ration):bksl-nl if ...:bksl-nl ...bksl-nl return Truebksl-nl else:bksl-nl return ...bksl-nlbksl-nlbksl-nl# Testsbksl-nlmedor = Chien('Médor', 12.0)bksl-nlassert medor.donnepy-undnom() == 'Médor'bksl-nlassert medor.donnepy-undpoids() == 12.0bksl-nlassert medor.machouille('bâton') == 'bâto'bksl-nlassert medor.aboie(3) == 'OuafOuafOuaf'bksl-nlassert not medor.mange(2.0)bksl-nlassert medor.mange(1.0)bksl-nlassert medor.donnepy-undpoids() == 13.0bksl-nlassert medor.mange(1.3)bksl-nlbksl-nlclass Chien:bksl-nl def py-undpy-undinitpy-undpy-und(self, nom, poids):bksl-nl self.nom = nombksl-nl self.poids = poidsbksl-nlbksl-nl def donnepy-undnom(self):bksl-nl return self.nombksl-nlbksl-nl def donnepy-undpoids(self):bksl-nl return self.poidsbksl-nlbksl-nl def machouille(self, jouet):bksl-nl resultat = ""bksl-nl for i in range(len(jouet) - 1):bksl-nl resultat += jouet[i]bksl-nl return resultatbksl-nlbksl-nl def aboie(self, nombre):bksl-nl return "Ouaf" py-str nombrebksl-nlbksl-nl def mange(self, ration):bksl-nl if 0 < ration <= self.poids / 10:bksl-nl self.poids += rationbksl-nl return Truebksl-nl else:bksl-nl return Falsebksl-nlbksl-nl

A

Les trois premières méthodes (__init__, donne_nom et donne_poids) ne présentent pas de difficultés. On notera cependant l'utilisation de l'argument self qui permet d'indiquer que cette méthode s'applique à l'objet concerné par l'appel. Lors de l'utilisation de ces méthodes on omet ce paramètre : chien.donne_nom() par exemple, en effet il est passé avec chien.

Les trois autres méthodes (machouille, aboie et mange) prennent deux arguments : self (utilisé préfixé) et un paramètre à fournir postfixé lors de l'appel.

Dans le cas de la méthode mange, on vérifie que ration satisfait les conditions à l'aide d'un test if 0 < ration <= self.poids / 10:. Il serait aussi possible d'utiliser un opérateur and : if 0 < ration and ration <= self.poids / 10:.

On pourrait enfin utiliser une assertion assert 0 < ration <= self.poids / 10:. Toutefois, cette façon de procéder génèrerait une erreur si la condition n'est pas respectée. L'utilisation du test classique permet de gérer précisément les deux cas de figure et de renvoyer False en cas d'échec du test.

Z

Aide pour machouille

Pour la méthode machouille on pourra recopier toutes les lettres de jouet sauf la dernière en parcourant les indices à l'aide de la boucle for i in range(len(jouet) - 1):