2013-07-28 61 views
0

弱引用可用於傳遞複合對象屬性?假設你有一個具有屬性A的類。你的代碼的任何部分現在都可以獲取對A的引用,但是如果由A組成的類實例被刪除,則必須刪除它,但如果它在其他地方被引用則不會。用弱引用來實現這種行爲是可以的,這種方式是對組合對象擁有對A的唯一強引用?使用弱引用來實現合成

class B: 
def __init__(self): 
    self.A = SomeClass() 
+0

爲什麼*必須*刪除A組件時刪除組件? – delnan

+0

如果組件被刪除必須刪除。 – user1461256

+0

這與問題似乎是相反的。在任何情況下,都不會發生:'B'實例具有對'SomeClass'對象的引用,因此它保持活動狀態。 – delnan

回答

0

的Python刪除標記的物體,用於潛在缺失和遞減基準計數器 - 僅當參考計數器到達零時發生最終刪除。

+0

僅在CPython中。這是一個實現功能,不是語言規範的要求。 – Marcin

1

弱引用用於避免保留實例,而不是確保在其參考標準時刪除對象。

SomeClass()實例將從內存中,當所有引用都被刪除(與不弱引用是很強的參考,而不是任何參考)刪除。

如果B().A屬性是參考的SomeClass()一個實例,然後該實例將被當B().A引用反彈到別的東西或清除(如果B()被刪除B().A屬性會自動清零)刪除作爲基準計數以SomeClass()下降到0。

換句話說,如果B().A要成爲一個弱引用SomeClass(),而且沒有其它引用SomeClass(),解除引用B().A將返回None,因爲SomeClass()已被刪除。

使用弱引用B().A可以,但是,有一種方法來確保B().A分別予以唯一強引用該SomeClass()實例。

0

如果我理解正確的話,你的使用情況是這樣的:

b = B() 

def reset_b(): 
    global b 
    b = B() # drops the reference to b, so it (and b.A) should be garbage collected 

def get_a(): 
    return b.A 

和你關注的是,從保存返回get_a引用Ab已經復位後仍然有效。如果這是正確的,那麼弱引用可能是一個辦法解決它:如果它是b.A對象時,它指的是已被刪除後使用

import weakref 

def get_a(): 
    return weakref.proxy(b.A) 

proxy對象將提高大多數操作異常。

雖然我不確定這是不錯的設計。更好的解決方案可能是簡單地記錄get_a的結果不應長期緩存。相反,每當需要新的參考時,應該再次調用它。這不需要任何複雜的引用方案或異常處理,而且思考和測試也更容易。