La classe Chien⚓︎
On souhaite dans cet exercice créer une classe Chien
ayant deux attributs :
-
un nom
nom
de typestr
, -
un poids
poids
de typefloat
.
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'attributnom
; -
chien.donne_poids()
qui renvoie la valeur de l'attributpoids
; -
chien.machouille(jouet)
qui renvoie son argument, la chaine de caractèresjouet
, privé 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'attributpoids
en lui ajoutant la valeur de l'argumentration
(de typefloat
).
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
siration
satisfait ces conditions et que l'attributpoids
est bien modifié,False
dans le cas contraire.
Exemples
>>> 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
.
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-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 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
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):