1 回答

TA貢獻(xiàn)1856條經(jīng)驗 獲得超17個贊
不,在 Python 中你應(yīng)該使用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 調(diào)用,self._python_resource可能已經(jīng)被 GC,但我們不確定,所以我們什么都不做,依靠 GC 來釋放self._python_resource.
我不確定您的意思,但只要您持有對對象的引用(并且只要它不是弱引用),它就不會被 GC 處理。
注 2:如果一個上下文管理器的對象在沒有with阻塞的情況下使用會發(fā)生什么?然后當(dāng)對象被垃圾收集時資源將被釋放 - 但我不會擔(dān)心。使用上下文管理器是 Python 中的常見習(xí)慣用法(請參閱任何帶有open()ing 文件的示例)。如果這對您的應(yīng)用程序至關(guān)重要,您可以在 中獲取資源__enter__(),除非在with塊中否則不會獲取資源。
注意 3,關(guān)于循環(huán)引用:如果你有兩個對象相互持有引用,你就形成了循環(huán)引用,這樣兩個對象就不會被“常規(guī)”引用計數(shù) GC 釋放。相反,它們將由分代 GC 收集,除非他們碰巧有__del__方法。__del__禁止 GC 收集對象。見gc.garbage:
收集器發(fā)現(xiàn)無法訪問但無法釋放的對象列表(不可收集的對象)。默認(rèn)情況下,此列表僅包含帶有__del__() methods. [1] 具有__del__()方法并且是引用循環(huán)的一部分的對象 會導(dǎo)致整個引用循環(huán)不可收集,包括不一定在循環(huán)中但只能從循環(huán)中訪問的對象。
Python 3.4 引入了PEP-442,它引入了安全對象終結(jié)。無論哪種方式,您都不會有無效的引用。如果您有屬性 ( hasattr(self, "_python_resource")),它將是有效的。
添加回答
舉報