Python del on类

2024-09-23 00:14:56 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有一个python类:

class A(object):
    def __del__(self):
        print "Del!"

在删除任何实例的A时调用__del__

对一个班级也可以这样做吗?我想在类本身被垃圾收集时调用一些方法,我假设这是在脚本退出时完成的。

提前感谢你的指点!


编辑:正如我所料,每个人都在试图让我远离使用这种技术(我可能会自己发表这样的评论:),尽管问题仍然存在:这可能吗?

我想如下:我有一个需要清理的静态成员的类。

class A(object):
    class Meta(type):
        def __new__(mcs, name, bases, attrs):
            attrs['conn'] = sqlite3.connect( DB_FILE )
            return type.__new__(mcs, name, bases, attrs)

    __metaclass__ = Meta

我想调用A.conn.close(),但就在程序关闭之前,即当我知道不再创建A的实例时。我知道我可以用atexit来做,但这看起来很难看。


Tags: 实例nameselfnewobjectdeftypeconn
1条回答
网友
1楼 · 发布于 2024-09-23 00:14:56

问题是类包含返回自身的循环引用,因此当它们被删除时,它们不容易被收集,因此不调用元类的__del__方法。

我可以使用Pypy的Python实现调用它,但不能使用cpython-2.6或3.2。即使要触发它,我也必须手动调用垃圾收集器- 众所周知,程序出口处的Python环境充满了不一致性,当存在足够的类内部信息以允许sae关闭时,调用__del__方法的可能性非常小。

这是我的Pypy会话,我在其中触发了对类__del__的调用

 ~]$ pypy                                                                                       
Python 2.5.2 (78826, Nov 29 2010, 00:18:05)                                                                       
[PyPy 1.4.0] on linux2                                                                                            
Type "help", "copyright", "credits" or "license" for more information.                                            
And now for something completely different: ``sorry, I'll teach the cactus how                                    
to swim later''                                                                                                   
>>>> import gc
>>>> class Meta(type):         
....    def __del__(cls):                          
....       print ("Arghh!!")                                              
....                                                                      
>>>> class A(object):                                                                     
....   __metaclass__ = Meta                                                                                     
....                                                                                                                                                                                                                
>>>> del A                                                                                                        
>>>> gc.collect()                                                                                                 
Arghh!!                                                                                                           
0                                                                                                                 
>>>>

相关问题 更多 >