Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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类的对象_Python_Class_Oop_Object_Self - Fatal编程技术网

销毁python类的对象

销毁python类的对象,python,class,oop,object,self,Python,Class,Oop,Object,Self,嗨,如果满足if语句的条件(在一段时间内),我正在尝试销毁一个类对象 这样想:你要求一个类使用一个内部方法进行自毁,这有点像试图吃掉你自己的嘴 幸运的是,Python具有垃圾收集功能,这意味着一旦类的所有引用都超出范围,它就会自动销毁 如果在销毁实例时需要执行某些特定操作,您仍然可以重写\uu del\uu(),这将有点像析构函数。下面是一个愚蠢的例子: class SelfDestruct: def __init__(self): print("Hi! I'm

嗨,如果满足if语句的条件(在一段时间内),我正在尝试销毁一个类对象


这样想:你要求一个类使用一个内部方法进行自毁,这有点像试图吃掉你自己的嘴

幸运的是,Python具有垃圾收集功能,这意味着一旦类的所有引用都超出范围,它就会自动销毁

如果在销毁实例时需要执行某些特定操作,您仍然可以重写
\uu del\uu()
,这将有点像析构函数。下面是一个愚蠢的例子:

class SelfDestruct:
    def __init__(self):
        print("Hi! I'm being instanciated!")
    
    def __del__(self):
        print("I'm being automatically destroyed. Goodbye!")

    def do_stuff(self):
        print("I'm doing some stuff...") 
现在,尝试在本地范围(例如函数)中实例化此类:

在这里,对象的寿命受函数的约束。这意味着一旦通话结束,它将自动被销毁。因此,输出应该如下所示:

>>> make_suicidal_class()
"Hi! I'm being instanciated!"
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm doing some stuff..."
"I'm being automatically destroyed. Goodbye!"
>>>
如果类在全局作用域中实例化,则在程序结束之前不会销毁它

另外,应该注意的是,手动调用
\uu del\uu()
析构函数实际上并不会销毁对象。这样做:

foo = SelfDestruct()
foo.__del__()
foo.do_stuff()
结果如下:

"Hi! I'm being instanciated!"
"I'm being automatically destroyed. Goodbye!"
"I'm doing some stuff..."
因此,这个实例仍然有一个脉冲。。。如果确实需要防止实例在当前范围内再次被引用,则必须调用
delfoo

尽管如前所述,Python实际上引用了类和变量。因此,如果您的类对象用于elsewere,那么调用
delfoo
实际上不会从内存中释放它

在python文档中有一个详尽的解释

“del x”不直接调用x.del()——前者将x的引用计数递减1,后者仅在x的引用计数为零时调用


长话短说:别想了!让python来处理内存管理。垃圾收集的全部目的就是不再担心变量的寿命

在Python中不能手动销毁对象,Python使用自动内存管理。当一个对象不再被引用时,它可以被垃圾收集,在使用引用计数的CPython中,当一个引用计数达到零时,一个对象会被立即回收。因此,如果我创建这个类的另一个对象,当前对象将自毁?我们可以故意将引用计数设为零吗?只是好奇……不。不会的。同样,当对象不再被引用时,它们会被有效地销毁(在CPython中,这是它的工作方式,但它不是语言保证)。@sam在某些情况下<代码>x=Foo();del x删除对由
Foo()
创建的对象的唯一引用。然而,它并不总是那么直截了当。您不能直接操纵引用计数(如果您足够努力,几乎任何事情都是可能的,但这是一个非常糟糕的事情的配方),请容忍我试图理解这一点,谢谢您!对不起,如果我的解释不够清楚的话。不,很清楚!!,我只需要告诉我的大脑去理解。那么,如果我想要一个按钮来杀死这个类,即使它正在运行呢?这取决于你的实现,但从我收集的信息来看,每次按下一个按钮,你的类就会在一个单独的线程中创建一个新的实例。如果这是一种理想的行为,那么以下帖子可能会有所帮助:
foo = SelfDestruct()
foo.__del__()
foo.do_stuff()
"Hi! I'm being instanciated!"
"I'm being automatically destroyed. Goodbye!"
"I'm doing some stuff..."