无法在python中找到对象破坏点

时间:2014-06-27 05:39:34

标签: python destructor

在你提出建议之前,让我写一个类似于我的案例的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__(),并且当客户端程序结束时,两者都无法获得控制权。理想情况下,我认为他们应该因为那样实例被破坏了。有没有其他方法可以实现这一点,而无需向客户端添加任何代码?我想客户端只进行一次调用来获取此句柄并让库处理所有内容。

1 个答案:

答案 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.