Rozważmy następujący Python (działa w 2.x lub 3.x)Klasy wewnętrzne: Jak uzyskać obiekt klasy zewnętrznej w czasie budowy?
class Outer(object):
pass
class Inner(object):
def __init__(self):
print("Inner.self", self)
o = Outer()
i = o.Inner()
Chcę dostać w swoje ręce o
natomiast wewnątrz Inner.__init__()
. Ale:
- Nie chcę
o
być jawne parametremInner
. - Chcę, aby
O.Inner
io.Inner
były obiektem klasy, a nie czymś dziwnym jak zamknięcie.
Czy możesz zasugerować, w jaki sposób mogę to osiągnąć?
Teraz moim najlepszym pomysłem jest użycie lokalnego magazynu wątków. W moim przypadku użycia, ilekroć skonstruować o.Inner()
, jestem już wewnątrz metody na o
gdzieś, i nie byłoby to nic wielkiego, aby dodać
threading.local()["my o object"] = o
do mojego kodu.
Daje to pojęcie o poziomie deprawacji, który chcę rozważyć.
Jest to jeden z tych przypadków, w których musimy zapytać: "Co to jest, co próbujesz osiągnąć? Ponieważ jest prawdopodobnie lepszy sposób na zrobienie tego." W Javie nie można umieścić dwóch (publicznych) klas w tym samym pliku, chyba że jeden z nich znajduje się w drugim. W Pythonie nie ma takiego wymogu, więc prawdopodobnie istnieje sposób, aby zrobić to, co chcesz, bez korzystania w ogóle z klas wewnętrznych. – MatrixFrog