2017-01-29 2 views
0

Welcher Art ist es, Attribute von Klasseninstanzen in Python 3 zu übernehmen?Klassenvererbung mit Klasseninstanzen anstelle von Klassen

Zum Beispiel, wie Attribute wie lastname von einer Instanz der Family Klasse erben:

class Family: 
    def __init__(self, last): 
     self.lastname = last 

class Person(Family): 
    def __init__(self, first): 
     self.firstname = first 

# The below code does not work an is an example of the desired usage: 
family = Family('Smith') 
person = Person('David', family) 

Ziel ist es für person Attribute erbt wie lastname vom family Instanz der Family Klasse:

>>> person.firstname 
'David' 
>>> person.lastname 
'Smith' 
+0

Sie würden diese Attribute nicht erben, Sie müssten sie initialisieren. –

Antwort

0

Ich sehe zwei Möglichkeiten: def lastname(self) für die Person Klasse implementieren und die Umsetzung auf die gespeicherte Familie verschieben.

Alternativ können Sie __getattr__ auf die Person implementieren und alles an die Familie weiterleiten. Ich bin mir bei diesem Ansatz noch nicht sicher, es scheint der regulären Vererbung zu ähnlich zu sein. Z.B. Wenn die Familie eine Methode number_of_members(self) hätte, hätte sie jeder auch. Wenn das in Ordnung ist, funktioniert die reguläre Vererbung genauso gut.

+0

ein anderer Gedanke: Sie können einen Dekorator für jede Methode von 'Family' verwenden, die Sie in' Person' kopieren möchten. Dann ordnen Sie in "Person .__ init__" alle Methoden mit dem richtigen Decorator zu. Oder einfach nach dem Dekorator in '__getattr__' suchen. –

+0

Reguläre Vererbung funktioniert zwar in Klassen, aber nicht in der Klasseninstanz, oder? Es macht mir nichts aus, wenn die Methoden der Familie vererbt werden, es sind die Attribute der Instanzen, die benötigt werden. Eine andere Antwort schlägt vor, die Attribute manuell zuzuweisen. Es gibt jedoch Dutzende von Attributen, die vererbt werden müssen. Gibt es eine Möglichkeit, die Attribute von der Klasseninstanz zu übernehmen, ohne sie explizit zuzuweisen? Oder tue ich es falsch und sollten 'People'-Instanzen zur' Family'-Klasseninstanz hinzugefügt werden? – Greg

+1

@dave: Sie haben Recht, also was Sie wollen, ist Proxy-Methodenaufrufe. Schauen Sie sich "__getattr__" an. Du solltest etwas dazu schreiben können: 'def __getattr __ (selbst, name): return getattr (self.family, name)' –

0

Ich denke, Sie brauchen etwas wie:

class Family: 
    def __init__(self, last): 
     self.lastname = last 

class Person(Family): 
    def __init__(self, first, family): 
     self.firstname = first 
     if isinstance(family, Family): 
      family = family.lastname 
     self.lastname = family 

family = Family('Smith') 
person = Person('David', family) 

oder vielleicht:

class Person(Family): 
    def __init__(self, first, family): 
     self.firstname = first 
     if isinstance(family, Family): 
      family = family.lastname 
     super().__init__(family) 
+0

Gibt es eine Möglichkeit, von "family" zu erben, ohne "self.family = family.lastname" anzugeben? Was ist, wenn die Familie 100 Attribute hat, die vererbt werden müssen? Gibt es eine Möglichkeit, sie einfach zu erben, ohne sie explizit zuzuweisen? – Greg

+0

Nicht das ist mir bewusst ohne ein paar Tricks. Mal sehen, was jemand anderes vorhat. Ein Weg, wenn Sie viele Attribute haben, besteht darin, die Attributliste als Liste zu behalten und '** kwargs' zu verwenden, um die Klassen zu initialisieren. Dies erfordert jedoch immer noch expliziten Code, um das Einfügen einer Instanz von einer anderen Instanz zu ermöglichen. –