Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我需要在删除实例时进行对象清理,但在退出时不需要。实例是否可以删除自身?_Python_Oop - Fatal编程技术网

Python 我需要在删除实例时进行对象清理,但在退出时不需要。实例是否可以删除自身?

Python 我需要在删除实例时进行对象清理,但在退出时不需要。实例是否可以删除自身?,python,oop,Python,Oop,我希望在运行时删除实例时进行一些清理,但在退出时进行垃圾收集时不进行清理 在下面的例子中,当c被删除时,一个文件被删除,这就是我想要的; 但是,当程序退出时,该文件也会被删除,这不是我想要的 class C: def __del__(self): os.remove(self.filename) c=C() del c 我可以将运行时实例删除与语句块联系起来,但在python退出时不执行相同的语句块吗 谢谢。CPython使用引用计数,偶尔只运行一次完全成熟的GC(删除循环引用)

我希望在运行时删除实例时进行一些清理,但在退出时进行垃圾收集时不进行清理

在下面的例子中,当c被删除时,一个文件被删除,这就是我想要的; 但是,当程序退出时,该文件也会被删除,这不是我想要的

class C:
  def __del__(self):
    os.remove(self.filename)

c=C()
del c
我可以将运行时实例删除与语句块联系起来,但在python退出时不执行相同的语句块吗


谢谢。

CPython使用引用计数,偶尔只运行一次完全成熟的GC(删除循环引用),
c=c();delc
会立即触发新的
c
,是的。对于
\uuu del\uu
和解释器出口:

当解释器退出时,不能保证为仍然存在的对象调用
\uuu del\uu()
方法

但这似乎不可能确定。另外(不可否认,这在实践中没有什么相关性),其他实现,如Jython和IronPython不使用引用计数=对象销毁/终结不太可预测(或者——理论上——可能根本不会发生,至少在.NET中)

无论如何:这个要求(仅在gc正常运行时执行
\uuu del\uuu
,而不是在解释器退出时)真的很难闻。你能详细解释一下为什么你需要关心这个吗


您可能需要一个。

CPython使用引用计数,偶尔只运行一次完全成熟的GC(删除循环引用),
c=c();delc
会立即触发新的
c
,是的。对于
\uuu del\uu
和解释器出口:

当解释器退出时,不能保证为仍然存在的对象调用
\uuu del\uu()
方法

但这似乎不可能确定。另外(不可否认,这在实践中没有什么相关性),其他实现,如Jython和IronPython不使用引用计数=对象销毁/终结不太可预测(或者——理论上——可能根本不会发生,至少在.NET中)

无论如何:这个要求(仅在gc正常运行时执行
\uuu del\uuu
,而不是在解释器退出时)真的很难闻。你能详细解释一下为什么你需要关心这个吗


你可能想要一个。

你想做的事情不是那么像蟒蛇(我认为这是不可能的)。通常不需要在运行时删除实例

您可以在运行时使用自己的函数而不是
del

def rem(object):
    object.__remove()

class C:
    def __remove(self):
        os.remove(self.filename)

c=C()
rem(c)
或者您可以将删除作为实例方法(更具pythonic!):

或者您可以在程序结束时销毁删除处理程序:

class C:
    instances = []

    def __init__(self):
        C.instances.append(self)

    def __del__(self):
        C.instances.remove(self)
        os.remove(self.filename)

c = C()
del c

# ... do something ...

for c in C.instances:
    del c.__del__

你想做的事情不是那么像蟒蛇(我认为这是不可能的)。通常不需要在运行时删除实例

您可以在运行时使用自己的函数而不是
del

def rem(object):
    object.__remove()

class C:
    def __remove(self):
        os.remove(self.filename)

c=C()
rem(c)
或者您可以将删除作为实例方法(更具pythonic!):

或者您可以在程序结束时销毁删除处理程序:

class C:
    instances = []

    def __init__(self):
        C.instances.append(self)

    def __del__(self):
        C.instances.remove(self)
        os.remove(self.filename)

c = C()
del c

# ... do something ...

for c in C.instances:
    del c.__del__

第二个(更像python)答案是我想做的,但是在我做了这样一个删除之后,我不想让c被访问,因为它只会在对它的任何调用中抛出错误……名称管理打破了第一个示例(而隐藏内置(在本例中是对象)总是一个坏主意™). 第三个结束于一个无操作的循环(你必须调用它们;))第二个(更具pythonic)答案是我认为我应该做的,但在我做了这样的删除之后,我不希望c被访问,因为它只会在对它的任何调用中抛出错误……名称管理打破了第一个示例(并且隐藏内置(在本例中是对象)总是一个坏主意™). 对于上下文管理器,第三个循环以无操作(您必须调用它们;)+1循环结束。此外,循环gc不能/不会使用上下文管理器的
\uuu del\uu
方法+1接触对象。此外,循环gc不能/不会使用
\uuu del\uu
方法接触对象。