Vererben direkt von einem eingebauten Typ im Vergleich zu seiner Wrapper-Klasse in Python
-
11-09-2019 - |
Frage
Ich lese zur Zeit Dive Into Python von Mark Pilgrim, und haben auf den Abschnitt bekommen Erbe. In Abschnitt 5.5 , Pilger erwähnt die Unterschiede zwischen den von der Wrapper-Klasse vererben UserDict vs erben vom eingebauten in dict Art.
Ich habe Probleme zu verstehen, warum jemand würde sogar mit der Wrapper-Klasse stören ... Was sind die Vorteile aus der UserDict Wrapper-Klasse erbt (oder eine der anderen UserXxx Klassen)?
Ihre Eingabe wird sehr geschätzt. Dank!
Lösung
Sie haben Recht:
Die Notwendigkeit für diese Klasse wurde weitgehend verdrängt durch die Fähigkeit zu Unterklasse direkt von dict (ein Feature das wurde zur Verfügung, beginnend mit Python-Version 2.2). Vor dem Einführung von dict, die UserDict Klasse wurde verwendet, um zu erstellen Wörterbuch artige Unterklassen, erhalten neue Verhaltensweisen durch zwingende bestehende Methoden oder neue hinzufügen.
Beachten Sie den ersten Satz. Dies ergibt sich aus dem Dokumentation von UserDict.
Oh, und in Python 3 ist es weg.
Andere Tipps
Die Wrapper-Klassen wurden aus Python 3 entfernt, da sie so nützlich alle für eine Weile jetzt nicht gewesen sein. Die mixin Klasse, UserDict.DictMixin
, ist eine ganz andere Geschichte - seine nützlichen Features sind jetzt alle über die "abstrakten Basisklassen" im collections
Modul gefunden
Ich fand, auf der Seite, die Sie verbunden sind, einen Hinweis auf die Antwort ein:
In Versionen von Python vor 2.2 Sie konnten nicht direkt Unterklasse vordefinierten Datentypen wie Strings, Listen und Wörterbücher. Kompensieren Hierfür kommt Python mit Wrapper Klassen, die das Verhalten nachahmen Diese vordefinierten Datentypen: UserString, Userlist, und UserDict. Verwendung einer Kombination aus normalen und speziellen Methoden, die UserDict Klasse tut ein ausgezeichnete Imitation eines Wörterbuchs. In Python 2.2 und höher können Sie erben Klassen direkt von Built-in Datentypen wie dict.
In der Realität heute Sie wollen wahrscheinlich zu Unterklasse dict statt UserDict.