Date de première publication : 2022/10/13
L'objectif de ce petit TP à tiroir est de vous faire coder une hiérarchie de classes en interaction
Un conteneur simple (une "liste")
Vous devez créer une classe Groupe
qui stocke des objets de classe A
dans une liste par exemple :
group = Group()
group.append(A())
group.append(A())
print(group) # ou group.print()
Pour afficher le contenu du groupe, vous pouvez surcharger l'opérateur __str__
Vérification de l'insertion
Il faut vérifier que les objets ajoutés au groupe sont de la bonne classe, par exemple :
group.append(A()) # OK
group.append(B()) # OK si B est une classe fille de A
group.append(C()) # NON
group.append(3) # 3
Pour ce faire, on peut utiliser ce genre de test :
if (isinstance(objet, Classe)):
Si le type n'est pas correct, on propose de lever l'exception TypeError
Copie de surface ou en profondeur ?
Que fait l'instruction suivante ?
g1 = group
g1
est un alias de group
Si vous utilisez le module copy
, que fait l'instruction suivante :
g2 = copy.copy(group)
g2
est un nouvel objet mais g2 et group partagent la même liste ...
Et celle-ci ?
g3 = copy.deepcopy(group)
g3 est un nouvel objet et contient une liste d'objets copiés de group
Serialisation
Avec le module pickle, il est possible de sérialiser un objet complexe :
with open('data.pickle', 'wb') as f:
pickle.dump(group, f, pickle.HIGHEST_PROTOCOL)
ou bien de le désérialiser :
with open('data.pickle', 'rb') as f:
group = pickle.load(f)
Si vous voulez un format de fichier compréhensible, vous pouvez changer le niveau de protocole ou bien installer une bibliothèque non standard comme jsons.
Et le tiroir alors ?
Bah, le voilà :
La classe Forme
peut même être rendue abstraite.
On peut également utiliser le module tkinter pour faire un affichage graphique...