====== Méthode spéciale ====== [[http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-python/edition-de-l-objet-et-acces-aux-attributs|Source]] ===== __init__ ===== __init__(self,arg1,argv2...): Constructeur, méthode appelée dans on instancie la classe. class Exemple: """Un petit exemple de classe""" def __init__(self, nom): """Exemple de constructeur""" self.nom = nom self.autre_attribut = "une valeur" ===== __del__ ===== __del__(self): Destructeur, méthode appelée quand on détruit la classe. def __del__(self): """Méthode appelée quand l'objet est supprimé""" print("C'est la fin ! On me supprime !") ===== __repr__ ===== def __repr__(self): Elle affecte la façon dont est affiché l'objet quand on tape directement son nom. On la redéfinit quand on souhaite faciliter le debug sur certains objets. class Personne: """Classe représentant une personne""" def __init__(self, nom, prenom): """Constructeur de notre classe""" self.nom = nom self.prenom = prenom self.age = 33 def __repr__(self): """Quand on entre notre objet dans l'interpréteur""" return "Personne: nom({}), prénom({}), âge({})".format( self.nom, self.prenom, self.age) >>> p1 = Personne("Micado", "Jean") >>> p1 Personne: nom(Micado), prénom(Jean), âge(33) >>> repr(p1) 'Personne: nom(Micado), prénom(Jean), âge(33)' >>> ===== __str__ ===== def __str__(self): Il existe une seconde méthode spéciale, __str__, spécialement utilisée pour afficher l'objet avec print. Par défaut, si aucune méthode __str__ n'est définie, Python appelle la méthode __repr__ de l'objet. La méthode __str__ est également appelée si vous désirez convertir votre objet en chaîne avec le constructeur str. class Personne: """Classe représentant une personne""" def __init__(self, nom, prenom): """Constructeur de notre classe""" self.nom = nom self.prenom = prenom self.age = 33 def __str__(self): """Méthode permettant d'afficher plus joliment notre objet""" return "{} {}, âgé de {} ans".format( self.prenom, self.nom, self.age) >>> p1 = Personne("Micado", "Jean") >>> print(p1) Jean Micado, âgé de 33 ans >>> chaine = str(p1) >>> chaine 'Jean Micado, âgé de 33 ans' >>> ===== __getattr__ ===== __getattr__(self, var): Python recherche l'attribut et, s'il ne le trouve pas dans l'objet et si une méthode ''__getattr__'' existe, il va l'appeler en lui passant en paramètre le nom de l'attribut recherché, sous la forme d'une chaîne de caractères. >>> class Protege: ... """Classe possédant une méthode particulière d'accès à ses attributs : ... Si l'attribut n'est pas trouvé, on affiche une alerte et renvoie None""" ... ... ... def __init__(self): ... """On crée quelques attributs par défaut""" ... self.a = 1 ... self.b = 2 ... self.c = 3 ... def __getattr__(self, nom): ... """Si Python ne trouve pas l'attribut nommé nom, il appelle ... cette méthode. On affiche une alerte""" ... ... ... print("Alerte ! Il n'y a pas d'attribut {} ici !".format(nom)) ... >>> pro = Protege() >>> pro.a 1 >>> pro.c 3 >>> pro.e Alerte ! Il n'y a pas d'attribut e ici ! >>> ===== __setattr__ ===== Cette méthode définit l'accès à un attribut destiné à être modifié. __setattr__(self, attr, val): def __setattr__(self, nom_attr, val_attr): """Méthode appelée quand on fait objet.nom_attr = val_attr. On se charge d'enregistrer l'objet""" object.__setattr__(self, nom_attr, val_attr) self.enregistrer() ===== __delattr__ ===== def __delattr__(self, nom_attr): Cette méthode spéciale est appelée quand on souhaite supprimer un attribut de l'objet, en faisant del def __delattr__(self, nom_attr): """On ne peut supprimer d'attribut, on lève l'exception AttributeError""" raise AttributeError("Vous ne pouvez supprimer aucun attribut de cette classe") ===== Bonus ===== objet = MaClasse() # On crée une instance de notre classe getattr(objet, "nom") # Semblable à objet.nom setattr(objet, "nom", val) # = objet.nom = val ou objet.__setattr__("nom", val) delattr(objet, "nom") # = del objet.nom ou objet.__delattr__("nom") hasattr(objet, "nom") # Renvoie True si l'attribut "nom" existe, False sinon