Recherche…


Syntaxe

  • class ClassName ( MainClass , Mixin1 , Mixin2 , ...): # Utilisé pour déclarer une classe nommée ClassName , principale (première) classe MainClass et mixins Mixin1 , Mixin2 , etc.
  • class ClassName ( Mixin1 , MainClass , Mixin2 , ...): # La classe 'main' ne doit pas nécessairement être la première classe; il n'y a vraiment pas de différence entre elle et le mixin

Remarques

Ajouter un mixin à une classe ressemble beaucoup à l'ajout d'une superclasse, car c'est à peu près tout. Un objet d'une classe avec le mixin Foo sera également une instance de Foo , et isinstance(instance, Foo) retournera true

Mixin

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.

Méthodes de substitution dans les mixins

Les mixins sont une sorte de classe utilisée pour "mélanger" des propriétés et des méthodes supplémentaires dans une classe. C'est généralement bien car plusieurs fois les classes mixin ne remplacent pas les méthodes des classes de base. Mais si vous remplacez des méthodes ou des propriétés dans vos mixins, cela peut entraîner des résultats inattendus car en Python, la hiérarchie des classes est définie de droite à gauche.

Par exemple, prenez les cours suivants

class Mixin1(object):
    def test(self):
        print "Mixin1"

class Mixin2(object):
    def test(self):
        print "Mixin2"

class BaseClass(object):
    def test(self):
        print "Base"

class MyClass(BaseClass, Mixin1, Mixin2):
    pass

Dans ce cas, la classe Mixin2 est la classe de base, étendue par Mixin1 et enfin par BaseClass. Ainsi, si nous exécutons l'extrait de code suivant:

>>> x = MyClass()
>>> x.test()
Base

Nous voyons que le résultat renvoyé provient de la classe de base. Cela peut conduire à des erreurs inattendues dans la logique de votre code et doit être pris en compte et gardé à l'esprit



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow