AndreLobato
AndreLobato

Reputation: 190

Python reverse introspection

Lets suppose this example: Two siblings classes where one loads the other class as a new attribute and then i wish to use this attribute from the main class inside the sibling.

a = 2
class AN(object):
   def __init__(self,a):
       self.aplus = a + 2
       self.BECls = BE(a)


class BE(object):
   def __init__(self,a):
       print a

   def get_aplus(self):
       ????

c = AN(a)

and i'd like to do:

c.BECls.get_aplus() 

and this shall return something like self.self.aplus (metaphorically), that would be 4

Resuming: get aplus attribute from AN inside BE class, without declaring as arguments, but doing a "Reverse introspection", if it possible, considering the 'a' variable must be already loaded trough AN.

Sorry if I not made myself clear but I've tried to simplify what is happening with my real code.

I guess the problem may be the technique i'm using on the classes. But not sure what or how make it better.

Thanks

Upvotes: 0

Views: 229

Answers (1)

Raymond Hettinger
Raymond Hettinger

Reputation: 226336

OP's question:

get aplus attribute from AN inside BE class, without declaring as arguments, but doing a "Reverse introspection", if it possible, considering the 'a' variable must be already loaded trough AN.

The closest thing we have to "reverse introspection" is a search through gc.getreferrers().

That said, it would be better to simply make the relationship explicit

class AN(object):
   def __init__(self,a):
       self.aplus = a + 2
       self.BECls = BE(self, a)

class BE(object):
   def __init__(self, an_obj, a):
       self.an_obj = an_obj
       print a

   def get_aplus(self):
       return self.an_obj.aplus

if __name__ == '__main__':
    a = 2
    c = AN(a)
    print c.BECls.get_aplus()     # this returns 4

Upvotes: 2

Related Questions