POO

Héritage : exercices

Rectangle, carré

Définir une classe Rectangle représentant des rectangles présentant un côté horizontal et un côté vertical.
Les attributs et méthodes seront :

  • la largeur (longueur du côté horizontal),
  • la hauteur (longueur du côté vertical),
  • le point sommet inférieur gauche,
  • une méthode de calcul du périmètre,
  • une méthode de calcul de l'aire.

Définir ensuite une classe Carre dérivant (≡ héritant) de la classe Rectangle.

  • Un code possible

class Point:
	"""
	Avec p = Point(3,4), on définit un point p 
	tel que p.x = 3 et p.y = 4.
	"""
	def __init__(self, abscisse, ordonnee):
		self.x = abscisse
		self.y = ordonnee
		
		
	def __str__(self):
		return "({}, {})".format(self.x, self.y)
		
	
class Rectangle:
	"""
	On définit un rectangle.
	Un côté horizontal de longueur largeur.
	Un côté vertical de longueur hauteur.
	On donne le sommet bas gauche.
	"""
	
	def __init__(self, lg, ht, cig):
		self.hauteur = ht
		self.largeur = lg
		self.cig = cig
		
	def aire(self):
		return self.largeur * self.hauteur
	
	def perimetre(self):
		return 2 * (self.largeur + self.hauteur)
		
	def __str__(self):
		ch = "\nRectangle. "
		ch += "Largeur : {}. ".format(self.largeur)
		ch += "Hauteur : {}. ".format(self.hauteur)
		ch += "Coin inférieur gauche : {}.".format(self.cig)
		return ch
		
		
class Carre(Rectangle):
	
	def __init__(self, cote, cig):
		super().__init__(cote, cote, cig)
		
	def __str__(self):
		ch = "\nCarré. "
		ch += "Longueur de côté : {}. ".format(self.largeur)
		ch += "Coin inférieur gauche : {}.".format(self.cig)
		return ch
		
		
r = Rectangle(2, 4, Point(1,1))
print(r)

print("Aire : {}.".format(r.aire()))
print("Périmètre : {}.".format(r.perimetre()))

c =  Carre( 3, Point(3,4))
print(c)
print("Aire : {}.".format(c.aire()))
print("Périmètre : {}.".format(c.perimetre()))

Compte bancaire

On considère la classe suivante :


class CompteBancaire:

	def __init__(self, nom_proprio, valeur):
		self.nom = nom_proprio
		self.solde = valeur
		self.rouge = False if valeur >= 0 else True

	def retirer(self, montant):
		if montant > 0 :
			self.solde -= montant
			if self.solde < 0 : self.rouge = True

	def deposer(self, montant):
		if montant > 0:
			self.solde += montant
			if self.solde >= 0 : self.rouge = False
			
	def transferer(self, montant, autreCompte):
		if montant > 0:
			self.retirer(montant)
			autreCompte.deposer(montant)

	def afficher(self):
		ch = "\nCompte de {}.\n".format(self.nom)
		ch += "Solde : {} euros.".format(self.solde)
		if self.rouge:
			ch += "\nAttention, vous êtes dans le rouge."
		print(ch)


marcel = CompteBancaire("Marcel", 300)
bernadette = CompteBancaire("Bernadette", 1800)

marcel.afficher()
bernadette.afficher()

print("\nTransfert du compte de Bernadette sur celui de Marcel.")

bernadette.transferer(500, marcel)

marcel.afficher()
bernadette.afficher()

Définir une classe CompteEpargne dérivant de la classe CompteBancaire.

Un attribut supplémentaire : le taux d'intérêt mensuel.

Et des méthodes :

  • une méthode permettant de modifier le taux,
  • une méthode déterminant le nouveau solde après n mois (on suppose l'absence de mouvement sur le compte... on ne cherchera pas ici à gérer le temps !)
  • Un code possible

class CompteBancaire:

	def __init__(self, nom_proprio, valeur):
		self.nom = nom_proprio
		self.solde = valeur
		self.rouge = False if valeur >= 0 else True

	def retirer(self, montant):
		if montant > 0 :
			self.solde -= montant
			if self.solde < 0 : self.rouge = True

	def deposer(self, montant):
		if montant > 0:
			self.solde += montant
			if self.solde >= 0 : self.rouge = False
			
	def transferer(self, montant, autreCompte):
		if montant > 0:
			self.retirer(montant)
			autreCompte.deposer(montant)

	def afficher(self):
		ch = "\nCompte de {}.\n".format(self.nom)
		ch += "Solde : {} euros.".format(self.solde)
		if self.rouge:
			ch += "\nAttention, vous êtes dans le rouge."
		print(ch)
		
		
class CompteEpargne(CompteBancaire):
	
	def __init__(self, nom, montant, taux):
		super().__init__(nom, montant)
		self._taux = taux
		
		
	@property
	def taux(self):
		return self._taux
		
	@taux.setter	
	def taux(self, nvTaux):
		self._taux = nvTaux
		
	def calculeSolde(self, nbMois):
		""" Nouveau solde après nbMois sans mouvement sur le compte."""
		self.solde *= (1 + self.taux/100)**nbMois 
 
		 

 
bernadette = CompteEpargne("Bernadette", 1800, 0.4)
 
bernadette.afficher()

bernadette.calculeSolde(12)
bernadette.afficher()


bernadette.taux = 0.8
bernadette.calculeSolde(10)
bernadette.afficher()