Python Language Mixin


Exemple

Un Mixin est un ensemble de propriétés et de méthodes pouvant être utilisées dans différentes classes, qui ne proviennent pas d'une classe de base. En langage de programmation orienté objet, vous utilisez généralement l' héritage pour donner aux objets de classes différentes la même fonctionnalité; Si un ensemble d'objets possède une certaine capacité, vous mettez cette capacité dans une classe de base dont les deux objets héritent .

Par exemple, disons que vous avez les classes Car , Boat et Plane . Les objets de toutes ces classes ont la capacité de voyager, ils ont donc la fonction de travel . Dans ce scénario, ils voyagent tous de la même manière de base; en empruntant un itinéraire et en le suivant. Pour implémenter cette fonction, vous pouvez dériver toutes les classes de Vehicle et placer la fonction dans cette classe partagée:

class Vehicle(object):
   """A generic vehicle class."""

   def __init__(self, position):
       self.position = position

   def travel(self, destination):
       route = calculate_route(from=self.position, to=destination)
       self.move_along(route)

class Car(Vehicle):
   ...

class Boat(Vehicle):
   ...

class Plane(Vehicle):
   ...

Avec ce code, vous pouvez appeler les travel en voiture ( car.travel("Montana") ), en bateau ( boat.travel("Hawaii") ) et en avion ( plane.travel("France") )

Cependant, que se passe-t-il si vous avez des fonctionnalités qui ne sont pas disponibles pour une classe de base? Disons, par exemple, que vous voulez donner à Car une radio et la possibilité de l'utiliser pour jouer une chanson sur une station de radio, avec play_song_on_station , mais vous avez aussi une Clock qui peut aussi utiliser une radio. Car et Clock peuvent partager une classe de base ( Machine ). Cependant, toutes les machines ne peuvent pas jouer de chansons. Boat et Plane ne peuvent pas (au moins dans cet exemple). Alors, comment accomplissez-vous sans dupliquer le code? Vous pouvez utiliser un mixin. En Python, donner un mixin à une classe est aussi simple que de l’ajouter à la liste des sous-classes, comme ceci

class Foo(main_super, mixin): ...

Foo héritera de toutes les propriétés et méthodes de main_super , mais aussi de celles de mixin .

Alors, pour donner les classes de Car et l' horloge la possibilité d'utiliser une radio, vous pouvez passer outre Car du dernier exemple et écrire ceci:

class RadioUserMixin(object):
   def __init__(self):
       self.radio = Radio()

   def play_song_on_station(self, station):
       self.radio.set_station(station)
       self.radio.play_song()

class Car(Vehicle, RadioUserMixin):
   ...

class Clock(Vehicle, RadioUserMixin):
   ...

Maintenant, vous pouvez appeler car.play_song_on_station(98.7) et clock.play_song_on_station(101.3) , mais pas quelque chose comme boat.play_song_on_station(100.5)

L'important avec les mixins est qu'ils vous permettent d'ajouter des fonctionnalités à des objets très différents, qui ne partagent pas une sous-classe "principale" avec cette fonctionnalité, mais partagent néanmoins le code. Sans les mixins, faire quelque chose comme l'exemple ci-dessus serait beaucoup plus difficile et / ou pourrait nécessiter des répétitions.