Betrachten Sie den folgenden Python (läuft in 2.x oder 3.x):Innere Klassen: Wie kann ich das Objekt der äußeren Klasse zur Konstruktionszeit erhalten?
class Outer(object):
pass
class Inner(object):
def __init__(self):
print("Inner.self", self)
o = Outer()
i = o.Inner()
Ich mag, während im Innern Inner.__init__()
auf o
meine Hände zu bekommen. Aber:
- Ich will nicht
o
ein expliziter Parameter aufInner
sein. - Ich möchte
O.Inner
undo.Inner
ein Klassenobjekt sein, nicht etwas Seltsames wie eine Schließung.
Können Sie mir vorschlagen, wie ich das erreichen könnte?
Im Moment ist meine beste Idee, lokalen Threadspeicher zu verwenden. In meinem Anwendungsfall, wenn ich ein o.Inner()
konstruieren, ich bin schon in einem Verfahren auf o
irgendwo, und es wäre keine große Sache
threading.local()["my o object"] = o
zu meinem Code hinzuzufügen sein.
Dies gibt Ihnen eine Vorstellung von dem Grad der Verdorbenheit, die ich bereit bin zu berücksichtigen.
Dies ist einer dieser Fälle, in denen wir fragen müssen: "Was willst du erreichen? Weil es wahrscheinlich einen besseren Weg gibt, es zu tun." In Java können Sie nicht zwei (öffentliche) Klassen in dieselbe Datei einfügen, es sei denn, eine davon ist innerhalb der anderen vorhanden. In Python gibt es keine solche Anforderung, also gibt es wahrscheinlich eine Möglichkeit, das zu tun, was Sie wollen, ohne überhaupt innere Klassen zu verwenden. – MatrixFrog