2017-12-03 4 views
3

Ich war überrascht, dass es kein Dokument zu sagen scheint, wie eine abgeleitete Klasse zur Basisklasse in Python gekürzt wird. Kann in Python eine abgeleitete Klasse zur Basisklasse gekürzt werden?

In der Tat kann es weniger verwendet werden. Aber ich bin vor aa Problem:

Simplified:

eine Basisklasse

class Base(object): 
    def __init__(self): 
     self.a = 10 

und eine abgeleitete Klasse:

class Derived(Base): 
    def __init__(self): 
     super(Derived, self).__init__() 
     self.b = 10 

Jetzt in irgendeiner Situation, ich habe die fusionieren Daten, die abgeleitet werden können und Base und nur Datenfelder in Base halten, so brauche ich eine Methode zu das Abgeleitete kürzen zu Base, aber ich habe nichts gefunden.

Ich habe versucht, eine get_base Methode sowohl in Base und Abgeleitet, und lassen Sie Base in abgeleiteten von super(Derived, self).get_base() zurückgeben, aber das zurückgegebene Ergebnis ist noch abgeleitet!

Ich drucke die Basis des __dict__ und stellte fest, dass es nur Methoden hat, keine benutzerdefinierte Attribute ...

Ich frage mich, Gibt es eine Möglichkeit existiert, um die Datenfelder der Basis von Abgeleitet Instanz zu erhalten (gestutzt)

Antwort

4

Ich frage mich Gibt es besteht eine Möglichkeit, die Datenfelder der Basis von Abgeleitet Instanz (truncate) zu bekommen?

Die Instanzdaten unterscheiden nicht, ob sie von der Basisklasse oder der abgeleiteten Klasse erstellt (oder geändert) wurden. Unabhängig von der Quelle werden die Attribute im selben Instanzwörterbuch gespeichert.

>>> c = Derived() 
>>> vars(c) 
{'a': 10, 'b': 10} 

Das heißt, könnten Sie die __init __() Methoden introspect die Variablennamen verwenden sie finden-out:

>>> Base.__dict__['__init__'].__code__.co_names 
('a',) 
>>> Derived.__dict__['__init__'].__code__.co_names 
('super', 'Derived', '__init__', 'b') 

Wenn der Ausgangspunkt eine gemischte Liste der Instanzen ist, könnten Sie die identifizieren Gemeinsame Attribute durch Überschneiden der Inhalte jeder Instanz und dann mit den gemeinsamen Attributen, um nur die abgeschnittenen Daten zu suchen:

instances = [Base(), Derived(), Base(), Derived(), Base()] 
common_attributes = reduce(set.intersection, map(set, map(vars, instances))) 
for inst in instances: 
    print {attr: getattr(inst, attr) for attr in common_attributes} 
+0

Oh, so schlau! Vielen Dank! Der Python ist flexibler und komplizierter als ich dachte. –

Verwandte Themen