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 seinen kids - 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):, nicht class 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.

InformationsquelleAutor Arne | 2013-12-30
Schreibe einen Kommentar