1 回答

TA貢獻1856條經驗 獲得超17個贊
不,在 Python 中你應該使用Context Managers:
class ResourceWrapper:
def __init__(self):
...
...
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
self._close(manual_close=False)
with ResourceWrapper() as wrapper:
# do something with wrapper
注1:方法中有這樣的注釋_close():
這意味著_close被 GC 調用,self._python_resource可能已經被 GC,但我們不確定,所以我們什么都不做,依靠 GC 來釋放self._python_resource.
我不確定您的意思,但只要您持有對對象的引用(并且只要它不是弱引用),它就不會被 GC 處理。
注 2:如果一個上下文管理器的對象在沒有with阻塞的情況下使用會發生什么?然后當對象被垃圾收集時資源將被釋放 - 但我不會擔心。使用上下文管理器是 Python 中的常見習慣用法(請參閱任何帶有open()ing 文件的示例)。如果這對您的應用程序至關重要,您可以在 中獲取資源__enter__(),除非在with塊中否則不會獲取資源。
注意 3,關于循環引用:如果你有兩個對象相互持有引用,你就形成了循環引用,這樣兩個對象就不會被“常規”引用計數 GC 釋放。相反,它們將由分代 GC 收集,除非他們碰巧有__del__方法。__del__禁止 GC 收集對象。見gc.garbage:
收集器發現無法訪問但無法釋放的對象列表(不可收集的對象)。默認情況下,此列表僅包含帶有__del__() methods. [1] 具有__del__()方法并且是引用循環的一部分的對象 會導致整個引用循環不可收集,包括不一定在循環中但只能從循環中訪問的對象。
Python 3.4 引入了PEP-442,它引入了安全對象終結。無論哪種方式,您都不會有無效的引用。如果您有屬性 ( hasattr(self, "_python_resource")),它將是有效的。
添加回答
舉報