6

假设我们在 python 中有一个类:

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

__del__在删除/垃圾收集任何A实例时调用。

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

提前感谢您的任何指点!


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

我想要以下内容:我有一个带有需要清理的静态成员的类。

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,但这看起来很丑陋。

4

1 回答 1

4

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

我可以使用 Pypy 的 Python 实现来触发它,但不能使用 cpython - 2.6 或 3.2。甚至为了触发它,我不得不手动调用垃圾收集器 - 众所周知,程序退出时的 Python 环境充满了不一致,并且在__del__存在足够的类内部信息以允许 sae 的情况下调用该方法的可能性关闭将非常苗条。

这是我的 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                                                                                                                 
>>>>
于 2011-04-10T03:59:48.407 回答