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
class Immutable:
def __setattr__(self, name, value):
if name in self.__dict__:
raise AttributeError(f"L'attribut '{name}' est deja defini")
self.__dict__[name] = value