Python Language
Mixins
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
etPlane
. Les objets de toutes ces classes ont la capacité de voyager, ils ont donc la fonction detravel
. 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 deVehicle
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 outreCar
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)
etclock.play_song_on_station(101.3)
, mais pas quelque chose commeboat.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