Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Mixin ? C'est quoi ?

+1 vote

auriez vous un exemple simple et que l'on rencontre fréquemment au sujet des mixin ?

demandé 24-Jun-2016 par buffalo974 (2,886 points)

Ca ne répond pas vraiment à la question de l'usage des mixins mais la présentation de Raymond Hettinger à la PyCon 1015 contient de jolies démonstration du fonctionnement de l'héritage multiple.

2 Réponses

+3 votes
 
Meilleure réponse

Un mixin est un concept OO. Il s'agit d'une classe qui permet d'ajouter / modifier des comportements a une autre a l'aide de l’héritage multiple. On le reconnait facilement au fait que c'est une classe qui n'est jamais instanciée directement, et ne sert que pour l’héritage.

Pour prendre un exemple tiré de la bibliothèque standard, tu peux regarder la doc du module socketserver. Les différentes classes BaseServer peuvent prendre un mixin optionnel pour rendre le serveur asynchrone (il y en a même deux : ForkingMixIn et ThreadingMixin).

Ainsi, un serveur qui hérite uniquement de BaseServer ne peut traiter qu'un seul client a la fois, et rien qu'en ajoutant un mixin comme parent, ton serveur devient asynchrone. Tu remarqueras que le mixing est donné avant la classe parente, ainsi ses méthodes sont résolues en premier.

Attention toutefois, ce n'est pas le genre de truc dont il faut abuser (c'est d'ailleurs l'une des rares exceptions ou l’héritage multiple se justifie).

répondu 24-Jun-2016 par yoch (2,514 points)
sélectionné 26-Jun-2016 par buffalo974

Quand utiliserais tu un mixin dans le cadre d'un jeu video ? (un exemple)
Quelle alternative pour l' éviter ?

En Génie Logiciel, le Design Pattern Component s'implémente en principe avec des mixins.

Dans le jeu vidéo, ce pattern est parfois implémenté sous le nom de système à entité.

+2 votes

Dans le cas de django :

Les Mixins sont des classes "comme les autres", qui s'utilisent à l'aide de l'héritage multiple. Le cas le plus courant c'est la construction des classes *View dans le module generic de django. Regarde comment sont construites ces vues, et tu verras comment ça marche...

Elles overrident des fonctionnalités (méthodes) pour les modifier, on peut voir ça comme des interfaces (au sens java du terme) AVEC LEUR IMPLÉMENTATION.

Ainsi, une classe qui héritera de FormMixin sera capable d'interagir avec un formulaire... C'est pas plus compliqué que ça !

répondu 24-Jun-2016 par frague (646 points)

pour illustrer avec une vue dans django ca donnerait ca :

définition d'un mixin s'imple

class SuccessMixin(object):
    """
    Mixin to just return to the expected page
    where the name is based on the model name
    """
    def get_success_url(self):
        return reverse(self.model.__name__.lower())

et son utilisation dans le vue

class AppointmentsMixin(SuccessMixin):
    form_class = AppointmentsForm
    model = Appointments

comme c'est aussi un mixin je fais poupée russe et j'empile et ca donne par exemple :

class AppointmentsDeleteView(AppointmentsMixin, DeleteView):
    """
        to Delete Appointments
    """
    template_name = 'dj_diabetes/confirm_delete.html'

ca permet la concision et d'être DRY mais faut etre attentif à pas en abuser sinon on a vite fini de se perdre

Le site génial pour la documentation sur les Class based views c'est http://ccbv.co.uk/

Chaque classe reprend la définition des méthodes des mixins dont il hérite.

...