# Le constructeur

Un constructeur est une méthode spéciale d'une classe qui permet de construire un objet, de lui donner des attributs.

Le nom de cette méthode est “ __init__ ” et prend en premier argument “ self ”, qui représente l'objet courant, qui est cours de création.

Exemple : je crée un constructeur permettant de définir une personne

    class People:
        def __init__(self,firstname,lastname,age):
            self.firstname = firstname
            self.lastname  = lastname
            self.age       = age

Notre fonction init demande 3 paramètres, “ self ” étant un paramètre spécial.

Grâce à ce constructeur il ne reste qu'à créer des objets :

    >>> chuck = People("Chuck","Norris",81)

L'objet “chuck” a été créé, on peut désormais accéder à ses différents attributs, les lire et les modifier.

    >>> chuck.firstname
    'Chuck'
    >>> chuck.firstname = "Chucky"
    >>> chuck.firstname
    'Chucky'

# Le représentateur

Reprenons l'exemple précédent. Lorsque l'on souhaite afficher notre objet, la valeur retournée n'est pas tout à fait celle attendue.

    >>> chuck
    <__main__.People object at 0x03C12820>

Nous allons donc utiliser un représentateur pour mettre en forme l'objet.

Cette méthode se définit “ __repr__ ”.

    class People:
        def __init__(self,firstname,lastname,age):
            self.firstname = firstname
            self.lastname  = lastname
            self.age       = age

        def __repr__(self):
            return "Nom : %s , Prenom : %s , Age : %s" % (self.lastname, self.firstname, self.age)

    >>> repr(chuck)
    'Nom : Norris , Prenom : Chuck , Age : 81'

# Le décorateur

Le décorateur est une fonction permettant de modifier le comportement d'autres fonctions, évitant la répétition de code. Il est appelé par “ @nom_décoraeur ”.

    def title_decorator(function):
        def wrapper(*args, **kwargs):
            print("*"*30)
            print("-"*30)
            function(*args, **kwargs)
            print("-"*30)
            print("*"*30)
        return wrapper

    @title_decorator
    def title(titre):
        print(titre)

    >>> titre = "Ceci est mon texte décoré"
    >>> title(titre)
    ******************************
    ------------------------------
    Ceci est mon texte décoré
    ------------------------------
    ******************************

Ce décorateur permet simplement de mettre en forme un titre. Mais le décorateur, critiqué pour son nom ne définissant pas assez clairement sa fonction, peut avoir bien d'autres usages.

Par exemple, dans le cadre du développement web, les décorateurs sont très utilisés. Typiquement, pour les pages nécessitant une authentification, le décorateur “ @login_required ” du framework Django est très utile.

    from django.contrib.auth.decorators import login_required

    @login_required
    def my_page(request):
        ...

Tout comme “ @login_required ”, beaucoup de décorateurs sont déjà développés, nécessitant un simple import.