在你提出建议之前,让我写一个类似于我的案例的POC代码:
class X:
_instance=0
def _new__():
if cls._instance:
#instance already instantiated , return the same instance
return cls._instance
cls._instance=initialize_instance()
return cls._instance
现在这是我的图书馆。客户端代码的工作方式如下:
var = X()
# Do some operations on var
.
.
.
#end of program
我面临的问题是当此客户端代码结束时,库中的函数必须执行(出于某些清理目的)。但我已尝试close()
,__del__()
,并且当客户端程序结束时,两者都无法获得控制权。理想情况下,我认为他们应该因为那样实例被破坏了。有没有其他方法可以实现这一点,而无需向客户端添加任何代码?我想客户端只进行一次调用来获取此句柄并让库处理所有内容。
答案 0 :(得分:0)
您尚未删除对X的所有引用,因为您仍然拥有cls._instance引用。这就是del没有被召唤的原因。
您可以将客户端对象包装在上下文管理器中,然后在exit方法上调用您需要调用的任何内容进行清理:
class Wrapper:
has_been_wrapped = False
# Use has_been_wrapped and is_first_instance to determine when
# the last reference to X is gone.
def __init__(self, *args, **kwargs):
if not self.has_been_wrapped:
self.is_first_instance = True
self.has_been_wrapped = True
else:
self.is_first_instance = False
self.var = X(*args, **kwargs)
def __enter__(self):
return self.var
def __exit__(self):
if is_first_instance:
# Do whatever you need to do to cleanup self.var here
然后你可以在任何地方使用X,就像这样使用它:
with Wrapper() as var:
# now you have an instance of X that will get
# cleaned up when the with statement ends.