2012-04-27 65 views
0

让我们假设这个例子:两个兄弟姐妹类,其中一个加载另一个类作为一个新属性,然后我希望从兄弟内的主类使用该属性。Python反向自省

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

恢复:让Aplus的属性从BE内部的AN中,没有声明为参数,而是做一个“反向内省”,如果可能的话,考虑到'a'变量必须已经通过AN加载。

对不起,如果我没有让自己清楚,但我试图简化我的真实代码发生了什么。

我想这个问题可能是我在类上使用的技术。但不知道什么或如何使它更好。

感谢

+0

为什么你不能只给了'BE'对象到其相应的'AN'参考? – 2012-04-27 06:10:29

+0

其实这是我喜欢做的事情,但怎么?欢呼 – AndreLobato 2012-04-29 00:46:44

+0

我不能给BE一个对象(an_obj = AN(self.a)),因为它会陷入一个无限循环,试图一遍又一遍地加载自身,上升的RunTimeError。 – AndreLobato 2012-04-29 02:28:37

回答

2

OP的问题:

得到从内Aplus的属性中类,不宣作为 参数,但做一个“反内省”,如果可能的话, 考虑“一'变量必须已经通过AN加载。

我们要“反观内省”最接近的是通过gc.getreferrers()的搜索。

这就是说,它会更好,只是作出明确的关系

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

我认为这将是解决这个问题的一种方法,但是在我的真实案例中,我真的很喜欢使用传递给主加载类的任何参数,否则我需要将几个对象传递给其他几个加载的类,这种感觉我喜欢做太多的重复。这种倒退似乎更合乎逻辑。我将尝试探索getreferrers并查看是否能解决问题。谢谢,答案出人意料地快。 – AndreLobato 2012-04-29 00:54:00

+0

我试图使用gc函数,但没有人给我我需要的对象。无论如何,欢迎为答案欢呼。希望找到一些聪明的方式解决这个问题。仍然没有嫌疑。这个答案是迄今为止最接近的解决方案。 – AndreLobato 2012-04-29 02:34:17