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 und Plane . 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 von Vehicle 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 Sie Car 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) und clock.play_song_on_station(101.3) , aber nicht so etwas wie boat.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



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow