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