Python: Vererbung versus Komposition
Ich arbeite mit zwei Klassen in Python, einer von denen sollte es gestattet sein, eine beliebige Anzahl Objekte aus einer anderen Klasse, als die Kinder und dabei ein Inventar dieser Kinder als ein Attribut. Vererbung schien die offensichtliche Wahl für diese übergeordneten<>Kind-situation, sondern das, was ich da angekommen sind, ist ein Beispiel der Zusammensetzung. Hier der vereinfachte code:
class Parent():
def __init__(self,firstname,lastname):
self.firstname = firstname
self.lastname = lastname
self.kids = []
def havechild(self,firstname):
print self.firstname,"is having a child"
self.kids.append(Child(self,firstname))
class Child(Parent):
def __init__(self,parent,firstname):
self.parent = parent
self.firstname = firstname
self.lastname = parent.lastname
Also im Grunde, während es scheint intuitiv sinnvoll, Kind() Erben vom Übergeordneten Element(), entfernen der Vererbung nicht ändern überhaupt nichts. Der einzige Vorteil, den ich sehen kann, für das verlassen Kind(Elternteil) statt nur Klasse Kind() sein würde, wenn ich brauchte, um viel mehr Methoden, um Eltern möchte ich Kind zu Erben. Mit der selbst.parent = parent, ich habe bereits Zugang zu jeder zukünftigen zusätzlichen Attributen des Übergeordneten Elements.
Gibt es eine andere Möglichkeit zur Verwendung der reinen Vererbung anstatt die Eltern Instanz in der Kind Konstruktor (Zusammensetzung)?
- Nein, du hast es der richtige Weg. Es wäre schlecht um die Einführung einer Kopplung zwischen Objekten durch Vererbung nur zu teilen Methoden zwischen Ihnen, es sei denn, Sie wollten, dass Sie eine "ist ein", und zwar auch dann, möchten Sie vielleicht gehen die "mixin" route statt.
- Vererbung ist für die "ist-ein" - Beziehungen. Ist ein Kind ein Elternteil? Nicht unbedingt. Die Zusammensetzung ist für eine "hat-ein" - Beziehungen. Ein Kind hat ein Elternteil (und ein Elternteil hat ein Kind). Sie würde die Vererbung verwenden, wenn Sie hatte eine person-Klasse, dann ein Kind ist eine person, so Kind erbt von person.
- Wenn Sie benötigt, die zwei Klassen zu teilen einige gemeinsame Methoden, dann könnte man immer Subklasse sowohl von einer Person in der Klasse.
- "Der Elternteil" oder "Kind" sind die zufälligen Eigenschaften, die "Menschen" passieren manchmal haben oder nicht. Also bei dieser Nomenklatur-Sie sollten nur eine Klasse
Person
mit seinenkids
- array leer ist oder nicht. - Möchten Sie vielleicht inheritence, wenn Sie wollen, dass Ihre Kinder in der Lage sein, um havechild(...).
- Als seitliche Anmerkung, Sie fast sicher wollte
class Parent(object):
, nichtclass Parent():
. Andernfalls erstellen Sie ein old-style ("classic") - Klasse, und Sie haben alle Arten von funky Regeln für die Vererbung, dass Sie wirklich nicht wollen, um die Mühe zu lernen. - Wie auch immer, ich denke du bist einfach nur verwirrt hier durch die Abstammung/Vererbung Beziehungen zwischen den Objekten und deren Typen. Und das ist verursacht durch die Kommissionierung ein schlechtes Beispiel. Die meisten Arten von Objekten, die haben keine Herkunft Fragen. Auto-Objekten keine Kinder haben, es ist nicht so verwirrend zu reden, den Sportwagen-Typ eine untergeordnete Art von Auto, aber Rad nicht als eine untergeordnete Art von Auto. Es sind nur ein paar Beispiele, die geführt haben könnte, um diese Verwirrung; man einfach haben, Pech.
- Vielen Dank für das feedback. Die wichtigste Erinnerung war, zu denken, über den Unterschied zwischen "hat-ein" und "ist-ein". Das eigentliche problem war nicht etwa Personen (Eltern oder Kinder), und die Art und Weise erweiterte ich die Eltern/Kind-Analogie, es würde gelten für Vögel auf einem Baum oder Dateien auf einem Regal. Jedes mal gibt es eine Gruppe von Objekten, die dieselben Attribute mit den "Eltern" - Objekt, wie z.B. Standort, Besitzer, Alter... im Grunde war ich mehr mit der Tradierung der Attribut-Daten von den Eltern auf das Kind als lassen das Kind Erben Verhalten. Ich sehe ein wenig klarer jetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist definitiv nicht gut zu inherint Kind von den Eltern oder die Eltern vom Kind.
Den richtigen Weg, es zu tun ist, um eine base-Klasse, sagen wir mal Person und Erben sowohl Kind und Eltern aus.
Ein Vorteil dabei ist, entfernen Sie code-Wiederholung, im moment haben Sie nur Vorname /Nachname Felder kopiert, in beiden Objekten, aber Sie können mehr Daten haben, oder weitere Methoden, wie
get_name()
arbeiten mit diesen Daten.Hier ist ein Beispiel:
Einen anderen Weg, dies zu tun ist, es zu tun, ohne Vererbung, aber nur eine Person, Objekt (vs Eltern und Kind).
Die Funktion der tracking-Familie-status-und-Eltern /Kinder kann verschoben werden in ein anderes Objekt.
Ein Vorteil dieser Methode ist, dass Sie die Folgen Prinzip der einzigen Verantwortung und halten Sie einfache Objekte, jedes Objekt hat nur eine Aufgabe.
Hier ist ein Beispiel:
Funktioniert es so:
First off, ich glaube du verwechselst die Dinge. Wie Sie selbst erwähnen Vererbung in einer Klasse verwendet, will Erben der Natur der übergeordneten Klasse und dann ändern Sie dieses Verhalten und erweitern.
In deinem Beispiel Kind erbt zwei Dinge von den Eltern. Der Konstruktor
__init__
undhavechild
. Sie überschreiben den Konstruktor und diehavechild
Methode nicht funktionieren sollte, da es keine Kinder Mitglied Liste anfügen das neue Kind. Auch scheint es, dass Sie nicht die Absicht haben, die Kinder haben Kinder.Dass gesagt wird, es scheint, Sie können tatsächlich wollen mal eine andere Frage, wie Zusammensetzung vs-Aggregation. Es gibt solch eine design-Wahl als Vererbung vs. Komposition, die eigentlich besonders interessant für Python, aber vor allem fragt Sie, ob Sie möchten, um die Wiederverwendung von code durch kopieren das Verhalten der standalone-übergeordnete Klasse (Vererbung) oder Sie trennen möchten anderen Klasse Verhalten-Granulat (aus Mangel an besseres Wort) und dann die Klassen erstellen, die Kompositionen dieser Granulate.
haben Sie einen Blick auf diese! Das Buch verwiesen wird ist auch gut bekannt und hat einen guten Katalog für verschiedene design-Muster.