Python Language
Mixins
Suche…
Syntax
- class ClassName ( MainClass , Mixin1 , Mixin2 , ...): # Wird verwendet, um eine Klasse mit dem Namen ClassName , der ersten (ersten) Klasse MainClass und Mixins1 , Mixin2 usw. zu deklarieren .
- class ClassName ( Mixin1 , MainClass , Mixin2 , ...): # Die ' main' -Klasse muss nicht die erste Klasse sein. Es gibt wirklich keinen Unterschied zwischen ihm und dem Mixin
Bemerkungen
Das Hinzufügen eines Mixins zu einer Klasse sieht sehr nach dem Hinzufügen einer Superklasse aus, weil es so ziemlich nur das ist. Ein Objekt einer Klasse mit dem Mixin- Foo wird auch eine Instanz von Foo sein und isinstance(instance, Foo)
gibt true zurück
Mixin
Ein Mixin ist eine Reihe von Eigenschaften und Methoden, die in verschiedenen Klassen verwendet werden können, die nicht aus einer Basisklasse stammen. In objektorientierten Programmiersprachen verwenden Sie normalerweise Vererbung , um Objekten unterschiedlicher Klassen die gleiche Funktionalität zu geben. Wenn eine Gruppe von Objekten über eine bestimmte Fähigkeit verfügt, ordnen Sie diese Fähigkeit einer Basisklasse zu, von der beide Objekte erben .
Angenommen, Sie haben die Klassen
Car
,Boat
undPlane
. Objekte aus allen diesen Klassen verfügen über die Fähigkeit zu reisen, sodass sie die Funktion "travel
. In diesem Szenario reisen sie auch alle auf dieselbe Weise. indem Sie sich eine Route besorgen und sich darauf bewegen. Um diese Funktion zu implementieren, können Sie alle Klassen vonVehicle
ableiten und die Funktion in diese gemeinsam genutzte Klasse einfügen: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): ...
Mit diesem Code können Sie die
travel
mit einem Auto (car.travel("Montana")
), einem Boot (boat.travel("Hawaii")
) und einem Flugzeug (plane.travel("France")
)plane.travel("France")
Was ist jedoch, wenn Sie über eine Funktionalität verfügen, die für eine Basisklasse nicht verfügbar ist? Angenommen, Sie möchten beispielsweise Car
ein Radio und die Möglichkeit geben, mit play_song_on_station
ein Lied auf einem Radiosender play_song_on_station
, aber Sie haben auch eine Clock
, die auch ein Radio verwenden kann. Car
und Clock
können eine Basisklasse ( Machine
) gemeinsam nutzen. Es können jedoch nicht alle Maschinen Songs abspielen. Boat
und Plane
können nicht (zumindest in diesem Beispiel). Wie schaffen Sie es also, ohne Code zu duplizieren? Sie können ein Mixin verwenden. In Python ist es so einfach, einer Klasse ein Mixin zuzuweisen, indem Sie es der Liste der Unterklassen wie dieser hinzufügen
class Foo(main_super, mixin): ...
Foo
werden alle Eigenschaften und Methoden der erben main_super
, sondern auch die von mixin
auch.
Um den Klassen
Car
und Clock die Möglichkeit zu geben, ein Radio zu verwenden, können SieCar
aus dem letzten Beispiel überschreiben und Folgendes schreiben: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): ...
Jetzt können Sie
car.play_song_on_station(98.7)
undclock.play_song_on_station(101.3)
, aber nicht so etwas wieboat.play_song_on_station(100.5)
Das Wichtigste bei Mixins ist, dass Sie damit Funktionen für viele verschiedene Objekte hinzufügen können, die keine "Haupt" -Unterklasse mit dieser Funktionalität teilen, aber trotzdem den Code für sie verwenden. Ohne Mixins wäre das Ausführen des oben genannten Beispiels viel schwieriger und / oder könnte eine gewisse Wiederholung erfordern.
Methoden in Mixins überschreiben
Mixins sind eine Art Klasse, mit der zusätzliche Eigenschaften und Methoden in eine Klasse "eingemischt" werden. Dies ist in der Regel in Ordnung, da die Mixin-Klassen die Methoden des anderen oder der Basisklasse häufig nicht überschreiben. Wenn Sie jedoch Methoden oder Eigenschaften in Ihren Mixins überschreiben, kann dies zu unerwarteten Ergebnissen führen, da in Python die Klassenhierarchie von rechts nach links definiert ist.
Nehmen Sie zum Beispiel die folgenden Klassen
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
In diesem Fall ist die Mixin2-Klasse die Basisklasse, erweitert um Mixin1 und schließlich um BaseClass. Also, wenn wir das folgende Code-Snippet ausführen:
>>> x = MyClass()
>>> x.test()
Base
Wir sehen, dass das zurückgegebene Ergebnis von der Basisklasse stammt. Dies kann zu unerwarteten Fehlern in der Logik Ihres Codes führen und muss berücksichtigt und berücksichtigt werden