[Python] Introspezione - Ottenere implicitamente una variabile della classe parent

Giovanni Porcari giovanni.porcari a softwell.it
Dom 13 Mar 2011 07:36:34 CET


Il giorno 13/mar/2011, alle ore 01.36, lex mlist ha scritto:

> Ciao a tutti,
> 
> mi trovo in una condizione particolare.
> Ho una classe che contiene dei dati, e in questa classe viene istanziata a sua volta un'oggetto che dovrebbe manipolare i dati contenuti nella classe stessa.
> Mi spiego con un esempio:
> 
> ===============================
> class A(object):
>     def __init__(self):
>         self.b = B()
>         self.txt = 'Ciao'
>         
> class B(object):
>     def saluta(self):
>         # accedere a self.txt della classe A
>         pass
> ===============================
> 
> Usando i metodi di B() attraverso A().b.saluta() vorrei che fosse stampato il valore di self.txt
> 
> Potrei ovviamente passargli il valore per parametro, ma il problema è che le funzioni reali devono manipolare parecchi dati e le funzioni vengono utilizzate
> in più punti del programma, per cui passare ogni volta tutti i dati necessari si rende scomodo. Cosi pensavo di poter sfruttare il potere dell'introspezione di Python.
> 
> Ho dato una occhiata al modulo 'inspect' ma purtroppo ho solo trovato come accedere al caller, e in questo caso, non riesco ad ottenere uno stack precedente
> (probabilmente perchè effettivamente A() non è un caller di B() ma ne crea solo una istanza, mentre il metodo è chiamato nello scope globale).
> 
> Come potrei risolvere?
> L'introspezione mi farebbe comodo, e sarebbe anche utile imparare questa cosetta :)
> Come sempre resto a disposizione per suggerimenti di ogni tipo.
> 


Siccome la risposta mi sembra banale forse mi sfugge qualcosa:

class A(object):
    def __init__(self):
        self.b = B(self)
        self.txt = 'Ciao'
        
class B(object):
    def __init__(self,parent):
        self.parent = parent

    def saluta(self):
        # accedere a self.txt della classe A
        print parent.txt



Ho frainteso la tua domanda ?

G



Maggiori informazioni sulla lista Python