Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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 del_Python_Class_Del - Fatal编程技术网

类上的Python del

类上的Python del,python,class,del,Python,Class,Del,假设我们有一个python类: class A(object): def __del__(self): print "Del!" 对任何实例进行删除/垃圾收集时,将调用\uuu del\uu 对一个班级也可以这样做吗?我希望在类本身被垃圾收集时调用一些方法,我假设这是在脚本出口处完成的 提前感谢您的指点 编辑:正如我所预料的那样,每个人都试图让我远离使用这种技术(我可能会自己发表这样的评论:),尽管问题仍然存在:这可能吗 我想做以下几点:我有一个类,其中有一个静态成员

假设我们有一个python类:

class A(object):
    def __del__(self):
        print "Del!"
对任何
实例进行删除/垃圾收集时,将调用
\uuu del\uu

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

提前感谢您的指点


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

我想做以下几点:我有一个类,其中有一个静态成员需要清理

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做这件事,但这看起来很难看。

问题是类包含循环引用回它们自己-所以当它们被删除时,它们不容易被收集-因此元类的方法odf不会被调用

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

这是我的Pypy会话,在这里我确实触发了对类“
\uuu del\uuu

 ~]$ 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                                                                                                                 
>>>>

使用
\uuu del\uu
已经可疑。它可以使对象不可GC(在存在循环的情况下,GC不知道它们必须按什么顺序调用,因为可能存在一些依赖项),并且由于它是不确定的,所以最好将清理放在上下文管理器中。你为什么认为你需要这个?你可以创建一个工厂类,它有一个
\uuuuu call\uuuuu
方法来创建所需类的新实例,还有一个
\uuuu del\uuuuuu
方法来做你想做的事情。无论如何,我想不出任何有用的东西可以用它来实现。千万不要依赖于gerbage集合来实现特定的行为。运行时没有义务收集任何东西,即使在程序终止时也是如此。如果您需要清理,请使用上下文管理器。在垃圾收集环境中,析构函数是一件坏事。避免它。或者,更确切地说,问一个关于你正在解决的问题的问题,而不是小的技术问题。也许这会带来真正的答案。
现在我要说的是完全不同的一句话:“对不起,我稍后会教仙人掌如何游泳”
这让我很开心。非常感谢。