我正在读代码.有一个类__del__定义了哪个方法.我发现这个方法用于销毁类的实例.但是,我找不到使用此方法的地方.主要原因是我不知道如何使用这种方法,可能不是这样:obj1.del().那么,我的问题是如何调用该__del__方法?感谢您的任何帮助.
ily*_* n. 143
__del__是终结者.当对象被垃圾收集时调用它,该对象在删除对象的所有引用之后的某个时刻发生.
在一个简单的例子中,这可能是在你说,del x或者,如果x是一个局部变量,在函数结束后.特别是,除非有循环引用,否则CPython(标准Python实现)将立即进行垃圾收集.
但是,这是CPython 的实现细节.Python垃圾收集的唯一必需属性是它在所有引用被删除后发生,因此这可能不一定发生在之后,可能根本不会发生.
更重要的是,变量可以存在很长时间,原因很多,例如传播异常或模块内省可以使变量引用计数大于0.此外,变量可以是引用循环的一部分- 开启垃圾收集的CPython中断最多但不是全部,这样的周期,甚至只是定期.
由于您无法保证它已被执行,因此不应该将您需要运行的代码放入__del__()- 而是,此代码属于块的finally子句try或with语句中的上下文管理器.不过,也有有效的使用情况为__del__:例如,如果一个对象X的引用Y,也保留副本Y参考在全球cache(cache['X -> Y'] = Y),那么这将是对礼貌X.__del__也删除缓存条目.
如果你知道析构函数提供了(违反上述指南)必要的清理,你可能想直接调用它,因为它没有什么特别的方法:x.__del__().显然,只有当你知道它不介意被调用两次时你才应该这样做.或者,作为最后的手段,您可以使用重新定义此方法
type(x).__del__ = my_safe_cleanup_method
Run Code Online (Sandbox Code Playgroud)
Cha*_*iam 65
我写了另一个问题的答案,尽管这是一个更准确的问题.
这是一个略微自以为是的答案.
不要用__del__.这不是C++或为析构函数构建的语言.该__del__方法确实应该在Python 3.x中消失,但我确信有人会找到一个有意义的用例.如果您需要使用__del__,请注意每个http://docs.python.org/reference/datamodel.html的基本限制:
__del__当垃圾收集器碰巧收集对象时调用,而不是在丢失对象的最后一个引用时而不是在执行时del object.__del__负责调用__del__超类中的任何一个,但不清楚这是在方法解析顺序(MRO)中还是仅调用每个超类.__del__垃圾收集器放弃检测和清除任何循环链接的手段,例如丢失对链表的最后引用.您可以从gc.garbage获取忽略的对象列表.有时您可以使用弱引用来完全避免循环.这有时会受到争议:请参阅http://mail.python.org/pipermail/python-ideas/2009-October/006194.html.__del__函数可以作弊,保存对对象的引用,以及停止垃圾回收.__del__被忽略.__del__补充__new__远远超过__init__.这让人感到困惑.请参阅http://www.algorithm.co.il/blogs/programming/python-gotchas-1- del -is-not-the-opposite-of- init /获取解释和问题.__del__在Python中不是一个"深受喜爱"的孩子.您会注意到sys.exit()文档没有指定在退出之前是否收集垃圾,并且存在许多奇怪的问题.调用__del__on globals会导致奇怪的排序问题,例如http://bugs.python.org/issue5099.__del__即使__init__失败也应该打电话?有关长线程,请参阅http://mail.python.org/pipermail/python-dev/2000-March/thread.html#2423.但另一方面:
__del__意味着你不要忘记致电一个密切的声明.有关专业观点,请参见http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python/__del__.这通常是关于释放ctypes或其他一些特殊资源.而且我个人不喜欢这个__del__功能的原因.
__del__它时,它就会变成三十条混乱的信息.所以,找个不使用的理由__del__.
Jas*_*ker 12
该__del__方法将在对象被垃圾收集时调用.请注意,它不一定能保证被调用.以下代码本身不一定会这样做:
del obj
Run Code Online (Sandbox Code Playgroud)
原因是del只将参考计数减1.如果其他东西有对象的引用,__del__则不会被调用.
但是有一些注意事项可以使用__del__.通常,它们通常不是很有用.听起来我更像是想要使用close方法或者使用with语句.
请参阅有关__del__方法的python文档.
另外需要注意的是: __del__如果过度使用,方法可以禁止垃圾收集.特别是,具有多个具有__del__方法的对象的循环引用将不会被垃圾收集.这是因为垃圾收集器不知道首先调用哪一个.有关详细信息,请参阅gc模块上的文档.
__del__当您的对象最终被销毁时,将调用该方法(注释拼写!).从技术上讲(在cPython中)就是没有更多对你的对象的引用,即当它超出范围时.
如果要删除对象,则调用__del__方法使用
del obj1
Run Code Online (Sandbox Code Playgroud)
这将删除该对象(前提是没有任何其他引用).
我建议你写一个像这样的小班
class T:
def __del__(self):
print "deleted"
Run Code Online (Sandbox Code Playgroud)
并在python解释器中进行调查,例如
>>> a = T()
>>> del a
deleted
>>> a = T()
>>> b = a
>>> del b
>>> del a
deleted
>>> def fn():
... a = T()
... print "exiting fn"
...
>>> fn()
exiting fn
deleted
>>>
Run Code Online (Sandbox Code Playgroud)
请注意,jython和ironpython对于删除和__del__调用对象的确切时间有不同的规则.因此,使用它并不被认为是好的做法,__del__并且当它被调用时,对象及其环境可能处于未知状态.它也不是绝对保证__del__- 解释器可以以各种方式退出而不删除所有对象.
| 归档时间: |
|
| 查看次数: |
102716 次 |
| 最近记录: |