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函数,但它们都没有给我所需的对象。无论如何,为答案干杯。希望能找到一些解决这个问题的聪明方法。还是没用。这个答案是迄今为止最接近的解决方案。