2012-04-27 62 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