Was geschieht, wenn ich in Python von einer Instanz anstelle einer Klasse erben soll?

8

Ich bin nur neugierig, was passiert, wenn ich eine Instanz in eine Klasse erben werde.

Also habe ich es versucht:

%Vor%

Ich bekomme (mindestens) den folgenden Fehler:

%Vor%

Ich frage mich nur: Vererbt eine Instanz etwas Sinnvolles / Nützliches oder einfach nur Unsinn?

(Die Frage ist ein bisschen akademisch und speziell über die Details der Vererbung einer Instanz. Es geht nicht um Alternativen wie Objektdelegierung oder allgemeine Designpraktiken.)

    
Michael 21.02.2017, 07:35
quelle

2 Antworten

8

Klassen sind genau wie Instanzen; Sie haben einen -Typ . Für Instanzen ist dieser Typ die Klasse, aber für Klassen heißt der Typ eine Metaklasse . Das Vererben von einer Klasse würde normalerweise den Metatyp der Basisklasse aufrufen, um ein neues Klassenobjekt zu erzeugen (mit type(base) ; für mehrere Basen gelten Einschränkungen). Der Standardmetatyp ist das type -Objekt, aber Sie können eigene Metaklassen erstellen .

Indem er von einer Instanz erbt, versucht Python, eine neue Klasse zu erstellen, indem er type(obj)(classname, bases, body_namespace) aufruft. Da type(obj) ist X und X.__init__() unterstützt diese Argumente nicht, schlägt der Aufruf fehl. Es gibt jedoch nichts, was dich davon abhält, dass dieses Teil funktioniert!

%Vor%

Natürlich bietet type viel mehr Funktionalität, die eine Klasse nicht standardmäßig anbietet; Es gibt eine Reihe von Deskriptoren, die Attribute für eine Klasse bereitstellen, die von anderen Teilen von Python erwartet werden. Deine Klasse müsste stattdessen alle diese decken; In der obigen Beispielausgabe werden Sie feststellen, dass repr(Child) <__main__.X object at 0x...> anstelle der erwarteten <class '__main__.Child'> erzeugt und dass keine Methode __call__ zum Erzeugen von Instanzen für die Klasse vorhanden ist. Wenn Sie also eine Instanz als Basisklasse für eine andere kann verwenden, müssen Sie nur die zusätzliche Arbeit hinzufügen, um alle erwarteten Funktionen zu definieren.

Am Ende ist die Verwendung einer Instanz als Basisklasse zwar möglich, hat aber keine praktischen Verwendungen, nicht, wenn einige der Anwendungsfälle bereits von Metaklassen abgedeckt sind.

    
Martijn Pieters 21.02.2017 07:44
quelle
-2

Python hat unter der Haube ein prototypisches Modell des objektorientierten Designs. Das bedeutet, dass alles, sogar Klassen, Objekte in der pythonischen Welt sind. Ссылка

Die Vererbungsbeziehung in Python wird über eine Referenz in der Instanz ausgeführt, die ihre Klasse signalisiert. Dies ist die Klasse . Sie können diesen Verweis während der Laufzeit auf eine andere Klasse ändern. Wenn Sie das Verhalten der Instanz zur Laufzeit ändern, implementieren Sie die dynamische Vererbung. Stellen Sie sich beispielsweise eine Instanz einer Liste eines Elements vor, die ListOfOne -Klasse, die über geeignete Methoden verfügt, um nur mit einem Element zu arbeiten. Wenn ein anderes Element hinzugefügt wurde, könnte sich der Verweis class auf RegularList ändern. Wenn die Liste geleert wurde, könnte sich ihre Klasse in EmptyList ändern.

Leider (oder nicht) versteckt Python all dies. Zum Beispiel erstellen Sie Ihre Prototypen unter dem Klassenlabel, und einige Operationen, die unter dieser Ansicht vollkommen legal sein könnten, sind verboten. So wäre es möglich, von einer Instanz zu erben, aber Python bestreitet die Möglichkeit.

    
Baltasarq 21.02.2017 07:44
quelle

Tags und Links