2012-02-14 110 views
-1

如果我有下面的代碼蟒蛇反射找到引用對象

class One: 
    scope = 'first_scope' 

class Two: 
    scope = 'second_scope' 
    contained_object = One() 

是否有可能,我給contained_object參考通過反射來確定它是否和引用它具有相同的scope對象?

感謝

編輯:道歉,如果這個問題不清楚,我是不是在蟒蛇術語不太清楚怎麼問它。我做作一種樣品

的一個例子可能是

def sample(input): 
    #code in here to find out if input.scope 
    # matches a.scope without having a reference to it 

a = Two() 
a.scope = 'first scope' 
a.contained_object.scope = 'will not match' 
sample(a.contained_object) 
+3

你的問題對我來說有點模糊,你能舉一個你想要做什麼的例子嗎? – 2012-02-14 12:02:16

+0

@Rik Poggi謝謝你讓我知道,我已經添加了一個示例來嘗試解釋我的意思。 – 2012-02-14 12:16:45

+1

你的例子看起來很奇怪,爲什麼你不能'a'傳遞給'sample'函數並讓它調用'a.contained_object'?你的問題的背景是什麼?你究竟在努力實現什麼? – 2012-02-14 12:22:30

回答

2

這是可行的,你可以這樣做:

import gc 

    class A(object): 
     scope = 'a' 

    class B(object): 
     scope = 'b' 
     contained = A() 

    b = B() 

    print gc.get_referrers(b.contained)[0]['scope'] 

但是,還有兩個問題: 1.爲什麼你想在第一個地方做?我對此有一種很不好的感覺,除非你有一個很好的理由,否則我絕不會建議你這樣做。 2.你需要弄清楚如何選擇正確的對象,當它有多個引用 - get_referrers()返回一個代表所有引用給定的對象的字典列表。

您需要更具體地描述您的問題以獲得更好的答案。

+0

這就是我正在尋找的。這個問題涉及控制情況的反轉,在這種情況下,我傳遞了「包含」對象,並希望僅爲同一範圍內的對象搜索數據庫以最小化時間。 – 2012-02-14 12:28:21

5

你的問題還不清楚。如果您的意思是說您處於變量contained_objectscope存在的上下文中,並且contained_object包含具有屬性scope的對象,那麼當然可以。

如果你的意思是,你只需One類型的對象,你想找到它的引用,你可以使用gc.get_referrershttp://docs.python.org/library/gc.html#gc.get_referrers

+0

感謝您的回答。我指的是當你有一個類型的對象,並希望找到它的引用。 – 2012-02-14 12:21:04