Outils pour utilisateurs

Outils du site


python:special_method

Méthode spéciale

__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

python/special_method.txt · Dernière modification : 2017/03/18 17:31 de root