Was ist der Zweck der inneren Klassen von Python?
Python ' s innen/verschachtelte Klassen verwirren mich. Gibt es etwas, das kann nicht erreicht werden ohne Sie? Wenn ja, was ist das?
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zitiert aus http://www.geekinterview.com/question_details/64739:
Der Hauptvorteil ist die Organisation. Alles, was erreicht werden kann mit inneren Klassen kann erreicht werden, ohne Sie.
InformationsquelleAutor der Antwort
Nicht. Sie sind absolut äquivalent zu der Definition der Klasse, die normalerweise auf der obersten Ebene, und dann kopieren einer Referenz in der äußeren Klasse.
Ich glaube nicht, dass es einen speziellen Grund, verschachtelte Klassen "erlaubt", außer es macht keinen besonderen Sinn, explizit "verbieten".
Wenn Sie sich für eine Klasse, besteht innerhalb des Lebenszyklus von außen/von der Eigentümer-Objekt und hat immer eine Referenz auf eine Instanz der äußeren Klasse innere Klassen, wie Java funktioniert es – dann-Python-geschachtelte Klassen sind nicht das Ding. Aber Sie hacken kann, etwas wie das Ding:
(Diese verwendet die Klasse Dekorateure, die neues in Python 2.6 und 3.0. Sonst müsste man sagen "Innen= innerclass(Innen)" nach der definition der Klasse.)
InformationsquelleAutor der Antwort
Gibt es etwas, das Sie brauchen, um Ihren Kopf herum wickeln, um in der Lage sein, dies zu verstehen. In den meisten Sprachen, Klassen-Definitionen sind Direktiven an den compiler. Das heißt, die Klasse wird erstellt, bevor das Programm überhaupt ausgeführt wird. In python werden alle Anweisungen ausführbar sind. Das bedeutet, dass diese Aussage:
ist eine Anweisung, die zur Laufzeit ausgeführt, so wie diesem:
Dies bedeutet, dass nicht nur können Sie erstellen, Klassen innerhalb anderer Klassen man kann Klassen erstellen überall Sie wollen. Betrachten Sie diesen code:
So, die Idee, eine "innere Klasse" ist nicht wirklich eine Sprache zu konstruieren; es ist ein programmer bauen. Guido hat eine sehr gute Zusammenfassung, wie es dazu kam,hier. Aber im wesentlichen ist die grundlegende Idee ist, dies erleichtert die Sprache die Grammatik.
InformationsquelleAutor der Antwort
Verschachteln von Klassen innerhalb von Klassen:
Geschachtelte Klassen aufblasen der definition der Klasse, was es immer schwieriger macht, um zu sehen, was Los ist.
Geschachtelte Klassen erstellen können, die Kupplung, das würde die Prüfung zu erschweren.
In Python können Sie mehr als eine Klasse in einer Datei/module, im Gegensatz zu Java, so dass die Klasse bleibt noch immer die Nähe der top-level-Klasse und konnte sogar den Namen der Klasse mit dem Präfix "_" zu helfen, bestätigen, dass Sie das andere nicht benutzen sollte.
Den Ort, wo geschachtelte Klassen können als nützlich erweisen, ist innerhalb der Funktionen
Die Klasse erfasst die Werte der Funktion können Sie dynamisch erstellen Sie eine Klasse wie template metaprogramming in C++
InformationsquelleAutor der Antwort
Verstehe ich die Argumente gegen eine geschachtelte Klassen, aber es ist ein Fall für einen Einsatz in einigen Fällen. Vorstellen, ich bin die Schaffung einer doppelt-verketteten Liste-Klasse, und ich brauche zum erstellen einer node-Klasse für maintaing die Knoten. Ich habe zwei Möglichkeiten, erstellen von Knoten-Klasse in die Klasse DoublyLinkedList, oder erstellen Sie die Knoten-Klasse außerhalb der Klasse DoublyLinkedList. Ich bevorzuge die erste Wahl, da in diesem Fall die Node-Klasse ist nur sinnvoll innerhalb der Klasse DoublyLinkedList. Zwar gibt es kein verstecken/Kapselung profitieren, es ist eine Gruppierung der Vorteil des seins in der Lage zu sagen, dass die Node-Klasse ist Teil des DoublyLinkedList Klasse.
InformationsquelleAutor der Antwort
Den Haupt-use-case-ich benutze diese für die Verhinderung der proliferation von kleinen Modulen und zu verhindern namespace-Verschmutzung, wenn einzelne Module nicht benötigt werden. Wenn ich die Erweiterung einer vorhandenen Klasse, aber, dass die bestehenden Klassen müssen auf eine andere Unterklasse, die sollte immer gekoppelt werden. Zum Beispiel, kann ich einen
utils.py
Modul, das hat viele Helfer-Klassen, die nicht notwendigerweise miteinander gekoppelt, aber ich verstärken wollen Kupplung für einige diese helper-Klassen. Zum Beispiel, wenn ich implementieren https://stackoverflow.com/a/8274307/2718295:
utils.py
:Dann können wir:
Natürlich, wir hätten vermied Erben
json.JSONEnocder
insgesamt und nur überschreiben (default)::
Manchmal aber auch nur für die convention, die Sie wollen
utils
aus Klassen für die Erweiterbarkeit.Hier ist ein anderer Anwendungsfall: ich möchte eine Fabrik für mutables in meinem OuterClass zimmerreserviereung, ohne das Sie aufrufen
copy
:Ziehe ich diese Muster über die
@staticmethod
Dekorateur, die Sie sonst verwenden würde für eine factory-Funktion.InformationsquelleAutor der Antwort
Habe ich verwendet Python ' s innere Klassen zu erstellen, die bewusst buggy Unterklassen innerhalb unittest-Funktionen (d.h. im inneren
def test_something():
), um näher an 100% Testabdeckung (z.B. Tests sehr selten ausgelöst logging-Anweisungen durch das überschreiben einiger Methoden).Im Nachhinein ist es ähnlich wie Ed ' s Antwort https://stackoverflow.com/a/722036/1101109
Solche innere Klassen sollte Gültigkeitsbereich und bereit sein, für die garbage collection wenn alle Referenzen entfernt wurden. Nehmen Sie zum Beispiel die folgenden
inner.py
Datei:Bekomme ich die folgende merkwürdige Ergebnisse unter OSX Python 2.7.6:
Tipp - gehen Sie nicht auf und versuchen dies mit Django Modelle, die schien zu halten, andere (Cache?) Verweise auf mein buggy-Klassen.
So im Allgemeinen, ich würde nicht empfehlen die Verwendung von inneren Klassen für diese Art von Zweck, es sei denn, Sie tun es wirklich Wert, 100% test-coverage und kann nicht mit anderen Methoden. Obwohl ich denke, es ist schön zu wissen, dass, wenn Sie die
__subclasses__()
ist, dass es manchmal verschmutzt durch innere Klassen. Entweder Weg, wenn Sie gefolgt sind, so weit ich denke, wir sind ziemlich tief in Python an dieser Stelle, private dunderscores und alle.InformationsquelleAutor der Antwort