#!/usr/bin/python
# -*- coding: utf-8 -*-

###############################################################################
### Correction du TP 4 (Mon chef d'oeuvre)                                  ###
### Par : Matthieu Aubry                                                    ###
###############################################################################


###############################################################################
### Ce qu'il faut retenir du TP                                             ###
###############################################################################
# 1) Pour chaque attribut privé, on créé systématiquement un accesseur et un  #
#    mutateur.                                                                #
# 2) Si on ne veut pas que l'utilisateur de la classe puisse lire ou modifier #
#    un attribut, on met l'accesseur / le mutateur en privé.                  #
# 3) Dans les méthodes de la classe, on utilise les accesseurs / mutateurs    #
#    pour lire / modifier les attributs                                       #
#                                                                             #
# Les deux premiers exercices sont faits, à vous de jouer pour le dernier.    #
###############################################################################



###############################################################################
### La classe Domino                                                        ###
###############################################################################

class Domino:
	""" Un domino """

	# --- Constructeur / Destructeur ---
	def __init__(self, faceA, faceB):
		self.__faceA = faceA
		self.__faceB = faceB

	def __del__(self):
		return

	# --- Accesseur ---
	# Tout le mode peut lire les valeurs du domino 
	# => les accesseurs sont publiques
	def getFaceA(self):
		return self.__faceA

	def getFaceB(self):
		return self.__faceB

	# --- Mutateurs ---
	# Je ne veux pas que mon joueur puisse modifier
	# la valeur de ses dominos
	# => mutateurs privés
	def __setFaceA(self, value):
		self.__faceA = value

	def __setFaceB(self, value):
		self.__faceB = value

	# --- Méthodes publiques ---
	# Dans toutes les méthodes, on récupère la valeur 
	# des attributs privés en utilisant les accesseurs
	# et non pas le nom de l'attribut directement 
	def show(self, horizontal=False):
		if horizontal:
			print "+---+---+"
			print "|",self.getFaceA(), "|", self.getFaceB(), "|"
			print "+---+---+"
		else:
			print "  +---+"
			print "  |",self.getFaceA(), "|"
			print "  +---+"
			print "  |",self.getFaceB(), "|"
			print "  +---+"

	# getValeur() est une méthode et pas un accesseur
	# car elle apporte une valeur ajoutée aux données
	# présentes dans la classe
	def getValeur(self):
		return self.getFaceA() + self.getFaceB()

###############################################################################
### La classe CompteBancaire                                                ###
###############################################################################

class CompteBancaire:
	""" Un compte bancaire """

	# --- Constructeur / Destructeur ---
	def __init__(self, nom="Dupont", solde=1000):
		self.__nom = nom
		self.__solde = solde

	# --- Accesseur ---
	def getNom(self):
		return self.__nom

	def getSolde(self):
		return self.__solde

	# --- Mutateurs ---
	def __setNom(self, value):
		self.__nom = value

	def __setSolde(self, value):
		self.__solde = value


	# --- Méthodes publiques ---
	def depot(self, montant):
		print "Dépot de", montant, "euro(s) sur le compte de", self.getNom()
		self.__setSolde(self.getSolde() + montant)

	def retrait(self, montant):
		print "Retrait de", montant, "euro(s) sur le compte de", self.getNom()
		self.__setSolde(self.getSolde() - montant)
		if self.getSolde() < 0:
			print "Attention", self.getNom(), "est à découvert"

	def affiche(self):
		print self.getNom(), "dispose de", self.getSolde(), "euro(s) sur son compte"

###############################################################################
### Pour tester les classes                                                 ###
###############################################################################

if __name__ == "__main__":
	# Les dominos
	dominos = []
	for i in range(7):
		for j in range(7):
			dominos.append(Domino(i,j))
	somme = 0
	for d in dominos:
		somme += d.getValeur()
		if d.getFaceA() == d.getFaceB():
			d.show(True)
		else:
			d.show()
	print "La somme des points de tous les dominos est :", somme

	print "------------------------------------------------------------------"

	# Le compte bancaire
	compte = CompteBancaire("Toto", 1000000) # Il est riche ce toto 
	# ... normal il touche 1 euro à chaque fois que je mets dans un programme
	# D'ailleurs je viens encore de le mettre
	compte.depot(1)
	# Combien a-t'il maintenant ?
	compte.affiche()
	# Toto retire des sous pour s'acheter un jet privé
	compte.retrait(1500000)



syntax highlighted by Code2HTML, v. 0.9.1