Python反向自省

Python反向自省,python,class,introspection,siblings,Python,Class,Introspection,Siblings,让我们假设这个例子:两个同级类,其中一个加载另一个类作为新属性,然后我希望从同级中的主类使用这个属性 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): ????

让我们假设这个例子:两个同级类,其中一个加载另一个类作为新属性,然后我希望从同级中的主类使用这个属性

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)
我想做:

c.BECls.get_aplus() 
这将返回类似self.self.aplus(隐喻)的内容,即4

恢复:从BE类内部获取aplus属性,不声明为参数,但执行“反向自省”,如果可能的话,考虑到“a”变量必须已经通过参数加载

抱歉,如果我没有说清楚,但我已经尝试简化我的真实代码

我想问题可能是我在课堂上使用的技巧。但不确定是什么或如何让它变得更好

谢谢

OP的问题:

从BE类内部获取aplus属性,而不声明为 争论,但如果可能的话,做一个“反向反省”, 考虑到“a”变量必须已通过加载

我们最接近于“反省”的事情是通过搜索

也就是说,最好是简单地将关系明确化

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

为什么你不能给
BE
对象一个对应
AN
的引用?实际上这是我喜欢做的,但是怎么做呢??Cheers我不能只给BE一个对象(an_obj=an(self.a)),因为它会陷入一个无限循环,试图一次又一次地加载它自己,导致运行时错误上升。@RaymondHettinger答案中的代码说明了如何。我认为这是解决这个问题的一种方法,但在我的实际案例中,我真的很喜欢使用任何传递给主加载类的参数,否则我需要将几个对象传递给其他加载类,这让我感觉重复太多了。这种倒退的方式似乎更符合逻辑。我将尝试探索getreferer,看看是否能解决这个问题。谢谢,答案出人意料地快。我尝试使用gc函数,但它们都没有给我所需的对象。无论如何,为答案干杯。希望能找到一些解决这个问题的聪明方法。还是没用。这个答案是迄今为止最接近的解决方案。