Czy w Pythonie można uzyskać obiekt, na przykład Foo, który zawiera inny obiekt, pasek, z poziomu samego paska? Oto przykład tego, co mam na myśli:Czy to możliwe? Dzięki!Uzyskiwanie obiektu kontener/obiekt nadrzędny z poziomu Pythona
Odpowiedz
Przepuścić odniesienie do obiektu bar, tak jak poniżej:
class Foo(object):
def __init__(self):
self.text = "Hello World" # has to be created first, so Bar.__init__ can reference it
self.bar = Bar(self)
class Bar(object):
def __init__(self, parent):
self.parent = parent
self.newText = parent.text
foo = Foo()
Edit: jak podkreślił @thomleo, może to spowodować problemy z zbierania śmieci. Proponowane rozwiązanie jest określone w http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python/ i wygląda
import weakref
class Foo(object):
def __init__(self):
self.text = "Hello World"
self.bar = Bar(self)
class Bar(object):
def __init__(self, parent):
self.parent = weakref.ref(parent) # <= garbage-collector safe!
self.newText = parent.text
foo = Foo()
Dzięki, to działa. Jedyny problem jaki widzę z tym, to gdy próbuję uzyskać dostęp do wielu obiektów, będę wywoływał 'parent.parent.parent.etc'. Czy jest to lepszy sposób na zrobienie tego? –
Jeśli się nie mylę, jest to również poważny problem. Kiedy spróbujesz zrobić '' del foo'', to niekoniecznie zniszczy go jako odniesienie do niego nadal istnieje w atrybucie '' .parent'' 'Bar'' zawiera ... –
@MichaelMcClenaghan, w takim przypadku możesz po prostu powtórzyć numer kilka razy zamiast ręcznie go wypisać. Oczywiście zależy to od struktury ... – batbrat
jest to możliwe, aby uzyskać obiekt, Foo powiedzieć, że zawiera inny obiekt, Bar, od wewnątrz samego Bar?
Not „automatycznie”, ponieważ język nie jest zbudowany tak, aw szczególności język jest zbudowany tak, że nie ma sposobu, aby zagwarantować, że Foo istnieje.
Powiedziawszy, możesz zawsze zrobić to jawnie. Atrybuty, podobnie jak każdy inny identyfikator w Pythonie, to tylko nazwy, a nie miejsce do przechowywania danych; więc nic nie stoi na przeszkodzie, aby instancja Bar miała ręcznie przypisany atrybut foo
, który jest instancją Foo, i na odwrót w tym samym czasie.
Co za pomocą dziedziczenia:
class Bar(object):
def __init__(self):
self.newText = self.text
class Foo(Bar):
def __init__(self):
self.txt = 'Hello World'
Bar.__init__(self)
foo = Foo()
print foo.newText
- 1. Uzyskiwanie funkcji Pythona dla obiektu kodu
- 2. prependTo najbliższy określony element nadrzędny nadrzędny z obiektu iframe
- 3. Uzyskiwanie obiektu z NSSet
- 4. Uzyskiwanie najwyższego poziomu UIViewController
- 5. Uzyskiwanie wersji aplikacji Grails z poziomu aplikacji
- 6. Znajdź ścieżkę nagłówka python z poziomu Pythona?
- 7. Boost.Python: Uzyskiwanie słabego odwołania Pythona do owiniętego obiektu C++
- 8. Uzyskiwanie indeksu obiektu z NSArray?
- 9. Nie uzyskiwanie tablicy z obiektu
- 10. Pierwsze węzeł nadrzędny z obiektu JSON z jQuery
- 11. Django: uzyskiwanie dostępu do instancji modelu z poziomu programu ModelAdmin?
- 12. Uzyskiwanie danych z PubMed przy użyciu Pythona
- 13. Uzyskiwanie stanu obiektu
- 14. Uzyskiwanie obiektu obrazu z tablicy bajtów
- 15. Uzyskiwanie elementu betonowego z obserwowalnego obiektu
- 16. Uzyskiwanie obiektu z observingArray według indeksu
- 17. iPhone - uzyskiwanie unikatowych wartości z obiektu NSArray
- 18. Uzyskiwanie danych z głęboko zagnieżdżonego obiektu json
- 19. Uzyskiwanie dostępu do pól z obiektu Proxied
- 20. Uzyskiwanie nazwy obiektu z obiektu klasy podklasy NSMangedObject
- 21. Uzyskiwanie dostępu do rejestrów niskiego poziomu wbudowanego urządzenia przy użyciu Pythona
- 22. Uzyskiwanie dostępu do metadanych Greasemonkey z poziomu twojego skryptu?
- 23. Uzyskiwanie dostępu do zmiennych instancji kontrolera z poziomu kontrolera rspec
- 24. Uzyskiwanie dostępu do właściwości masterpage z poziomu usercontrol
- 25. Get Pythona klasy obiektu z ciągiem
- 26. Testowanie jednostek Pythona nadrzędnych funkcji poziomu modułu
- 27. Uruchamianie Pythona interaktywnie z poziomu Sublime Text 2
- 28. Jak uzyskać kodowanie terminala z poziomu skryptu Pythona?
- 29. Jak uruchomić "Instalację python setup.py" z poziomu Pythona?
- 30. nie można uruchomić z poziomu Pythona binarny AWS lambda funkcji
Masz literówkę; w 'Foo .__ init__',' self.bar = Foo() 'powinno być' self.bar = Bar() '. W przeciwnym razie masz nieskończoną pętlę (aby utworzyć Foo, musisz najpierw utworzyć Foo). –
Dzięki, Naprawiono! :) –