弱引用可用於傳遞複合對象屬性?假設你有一個具有屬性A的類。你的代碼的任何部分現在都可以獲取對A的引用,但是如果由A組成的類實例被刪除,則必須刪除它,但如果它在其他地方被引用則不會。用弱引用來實現這種行爲是可以的,這種方式是對組合對象擁有對A的唯一強引用?使用弱引用來實現合成
class B:
def __init__(self):
self.A = SomeClass()
弱引用可用於傳遞複合對象屬性?假設你有一個具有屬性A的類。你的代碼的任何部分現在都可以獲取對A的引用,但是如果由A組成的類實例被刪除,則必須刪除它,但如果它在其他地方被引用則不會。用弱引用來實現這種行爲是可以的,這種方式是對組合對象擁有對A的唯一強引用?使用弱引用來實現合成
class B:
def __init__(self):
self.A = SomeClass()
弱引用用於避免保留實例,而不是確保在其參考標準時刪除對象。
的SomeClass()
實例將只從內存中,當所有強引用都被刪除(與不弱引用是很強的參考,而不是任何參考)刪除。
如果B().A
屬性是只參考的SomeClass()
一個實例,然後該實例將被當B().A
引用反彈到別的東西或清除(如果B()
被刪除B().A
屬性會自動清零)刪除作爲基準計數以SomeClass()
下降到0。
換句話說,如果B().A
要成爲一個弱引用SomeClass()
,而且沒有其它引用SomeClass()
,解除引用B().A
將返回None
,因爲SomeClass()
已被刪除。
使用弱引用的B().A
外可以,但是,有一種方法來確保B().A
分別予以唯一強引用該SomeClass()
實例。
如果我理解正確的話,你的使用情況是這樣的:
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
引用A
b
已經復位後仍然有效。如果這是正確的,那麼弱引用可能是一個辦法解決它:如果它是b.A
對象時,它指的是已被刪除後使用
import weakref
def get_a():
return weakref.proxy(b.A)
的proxy
對象將提高大多數操作異常。
雖然我不確定這是不錯的設計。更好的解決方案可能是簡單地記錄get_a
的結果不應長期緩存。相反,每當需要新的參考時,應該再次調用它。這不需要任何複雜的引用方案或異常處理,而且思考和測試也更容易。
爲什麼*必須*刪除A組件時刪除組件? – delnan
如果組件被刪除必須刪除。 – user1461256
這與問題似乎是相反的。在任何情況下,都不會發生:'B'實例具有對'SomeClass'對象的引用,因此它保持活動狀態。 – delnan