2011-08-30 87 views
2
對象的處置

我的設計如下:循環引用

  • __main__引用a
  • a引用b
  • b引用a
  • a被創建,然後從__main__
  • 設置的

因此ab有循環引用。不過,在del a我寧願處置ab

我在許多地方看到建議使用上下文管理器,特別是with而不是__del__()。然而,我所看到的with的所有例子在本地範圍內(例如某種方法)開始和結束

這可以用with優雅地執行嗎?
有什麼選擇?

回答

5

我建議之一:

  • 使用weakref - 不__del__但在 - 當循環引用涉及
  • 或者只在手動順序處置的東西,你需要的是有時適用明確dispose方法呼叫在正確的時間(s)

在一般情況下,當你知道你有循環引用,relyi自動處理__del__不是一個好主意。它很脆弱 - 即使您在某些情況下設法使其發揮作用,依賴關係的小改動可能會再次破壞它。

0

垃圾收集器應該處理這個問題。

2

有什麼選擇?

什麼都不做。直到您創建數百萬個這樣的循環引用 - 並且可以證明這(並且僅此)正在破壞您的程序 - 實際上並不重要。