沒有,如果你有一個參考該類的實例,那麼根據定義它有剩餘的引用。您可以使用del
關鍵字來刪除一個名稱(釋放該名稱對該對象的引用),但如果對該實例的引用在其他地方存在,則該實例將保留。
如果你要做的是確定性清理行爲,不要使用__del__
(這是不明確的或一致的方式確定性,並且在Python 3.4之前,如果週期中的任何成員可能導致引用循環泄漏是定義了一個__del__
終結器的類的一個實例)。讓類實現the context manager protocol,並使用with
語句的實例來獲得確定性清理;該實例將一直存在,直到最後一個引用消失,但只要__exit__
執行必要的資源釋放,實例的空殼就幾乎沒有任何成本。
由於上下文管理的一個例子,我們會讓x
的foo
實例屬性,而不是一個類屬性,我們會說,我們需要確保該實例的引用x
在已知的時間(注意消失,因爲del
只是刪除我們的參考,如果別人得救關閉a.x
,對象實際上不會被釋放,直到其他的參考文獻中也被釋放):
class foo(object):
def __init__(self, x):
self.x = x
print "hi"
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print "bye"
del self.x
with foo(123456789) as a:
print a.x # This works, because a.x still exists
# bye is printed at this point
print a.x # This fails, because we deleted the x attribute in __exit__ and the with is done
# a still exists until it goes out of scope, but it's logically "dead" and empty
'刪除了'可能?它在這裏做的竅門 – asiviero
http://stackoverflow.com/questions/16686788/python-how-to-kill-a-class-instance-object –
對於記錄,「x」甚至不是「a ',它是'foo'的類屬性;無論是否存在由'a'引用的'foo'實例,它都不會消失。 – ShadowRanger