Python: l'Héritage rapport à la Composition

Je suis en train de travailler avec deux classes en Python, dont l'une devrait être autorisé à avoir un nombre quelconque d'objets d'une autre classe que les enfants tout en gardant un inventaire de ces enfants comme un attribut. L'héritage semblait être le choix évident pour ce parent<>l'enfant de la situation, mais au lieu de ce que je suis arrivé à est un exemple de la composition. Voici le code simplifié:


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

Donc en gros, alors qu'il semble faire sens intuitif d'avoir des Enfants() hérite de l'objet Parent(), suppression de l'héritage, ne change rien du tout. Le seul avantage que je peux voir pour quitter Enfant(Parent) au lieu de simplement classe de l'Enfant() serait si j'ai besoin d'ajouter beaucoup plus de méthodes pour Parent que je voudrais Enfant d'hériter. À l'aide de la auto.parent = parent, j'ai déjà accès à toutes les futures attributs de la Mère.

Est-il une autre façon de l'utiliser pur héritage plutôt que de passer à la Parent exemple dans le Enfant constructeur (composition)?

Non, vous n'avez le droit chemin. Il serait mauvais pour introduire un couplage entre les objets via l'héritage tout simplement pour partager des méthodes d'entre eux, à moins que vous vouliez qu'ils ont un "est un" et même alors, vous pouvez aller de l' "mixin" route à la place.
L'héritage est pour "est-un" relations". Est un enfant, un parent? Pas nécessairement. La Composition est "a-un" relations". Un enfant a un père (et un parent a un enfant). Vous utiliser l'héritage si vous avez eu une personne de la classe, puis un enfant est une personne, de sorte que l'enfant allait hériter de personne.
Si vous avez besoin des deux classes de partager des méthodes communes, alors vous pourriez toujours les deux sous-classe d'une classe de Personne.
"Parent" ou "Enfant" sont accidentelle propriétés que "les Gens" arrive parfois d'avoir ou pas. Ainsi dans le cas de cette nomenclature, vous devriez avoir qu'une seule catégorie - Person avec ses kids tableau vide ou pas.
Vous pourriez l'héritage si vous voulez que vos enfants soient en mesure de havechild(...).

OriginalL'auteur Arne | 2013-12-30