2012-05-28 10 views
18

In Python, è possibile ottenere l'oggetto, ad esempio Foo, che contiene un altro oggetto, Barra, all'interno della Barra stessa? Ecco un esempio di cosa intendoOttenere contenitore/oggetto genitore da python

class Foo(object): 
    def __init__(self): 
     self.bar = Bar() 
     self.text = "Hello World" 

class Bar(object): 
    def __init__(self): 
     self.newText = foo.text #This is what I want to do, 
           #access the properties of the container object 

foo = Foo() 

È possibile? Grazie!

+2

Hai un errore di battitura; in 'Foo .__ init__',' self.bar = Foo() 'dovrebbe essere' self.bar = Bar() '. Altrimenti hai un ciclo infinito (per creare un Foo, devi prima creare un Foo). –

+0

Grazie, risolto! :) –

risposta

29

passare un riferimento all'oggetto Bar, in questo modo:

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: come sottolineato da @thomleo, questo può causare problemi con la raccolta dei rifiuti. La soluzione suggerita è disposto a http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python/ e si presenta come

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() 
+0

Grazie, questo funziona. L'unico problema che posso vedere è che quando cerco di accedere a molti oggetti, chiamerò 'parent.parent.parent.etc'. C'è un modo più ordinato per farlo? –

+3

Se non sbaglio, c'è anche un grosso problema con questo. Quando provi a fare '' del foo'' non lo distruggerà necessariamente come un riferimento ad esso ancora esiste nell'attributo '' .parent'' della '' Barra'' che contiene ... –

+0

@MichaelMcClenaghan, in tal caso, puoi semplicemente ripetere un certo numero di volte invece di scriverlo manualmente. Naturalmente, ciò dipende dalla struttura ... – batbrat

4

è possibile ottenere l'oggetto, dice Foo, che contiene un altro oggetto, Bar, dall'interno stesso bar?

Non

"automaticamente", perché la lingua non è costruito in quel modo, e, in particolare, il linguaggio è costruito in modo tale che non v'è alcun modo per garantire che Foo esiste.

Detto questo, puoi sempre farlo in modo esplicito. Gli attributi, come ogni altro identificatore in Python, sono solo nomi, non lo spazio di archiviazione per i dati; quindi niente ti impedisce di lasciare che l'istanza di Bar abbia un attributo foo assegnato manualmente che è un'istanza di Foo e viceversa allo stesso tempo.

-3

Cosa succede ad usare l'ereditarietà:

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 
Problemi correlati