Exercices Architecture & Patterns Controler l'écriture d'attributs avec __sétattr__
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Controler l'écriture d'attributs avec __sétattr__

La méthode __sétattr__ est appelee A CHAQUE FOIS qu'on assigne un attribut a un objet, y compris dans __init__. C'est donc plus puissant (et plus dangereux) que __gétattr__.

Attention au piege : si tu ecris self.x = valeur dans __sétattr__, ca rappelle __sétattr__ a l'infini (recursion). Pour eviter ca, il faut passer par self.__dict__ directement.

class Protege:
def __setattr__(self, name, value):
if name.startswith('_'):
raise AttributeError("Pas de noms commencant par _")
self.__dict__[name] = value

p = Protege()
p.nom = 'Alice' # OK
p._secret = 'oups' # AttributeError

Écris une classe Immutable dont les attributs ne peuvent etre assignes qu'une seule fois. Si on essaie de modifier un attribut deja defini, la classe leve une AttributeError avec le message "L'attribut 'nom_attribut' est deja defini".

Exemple :
obj = Immutable()
obj.x = 10 # OK
obj.y = 20 # OK
obj.x = 30 # AttributeError: L'attribut 'x' est deja defini

Tests (3/4)

Premier assignement OK
obj = Immutable()
obj.x = 10
assert obj.x == 10
Deuxieme assignement interdit
obj = Immutable()
obj.x = 10
try:
    obj.x = 20
    assert False, 'Devrait lever une erreur'
except AttributeError:
    pass
Plusieurs attributs differents OK
obj = Immutable()
obj.a = 1
obj.b = 2
assert obj.a == 1 and obj.b == 2

+ 0 tests cachés

Indices (3 disponibles)

solution.py