Python类的对象如何销毁

6

你好,我正在尝试在 while 循环内部的 if 语句条件满足时销毁一个类对象。

global variablecheck

class createobject:
        def __init__(self,userinput):
             self.userinput = input
             self.method()
         
        def method(self):
             while True:
                if self.userinput == variablecheck
                     print('the object created using this class is still alive')
                
                 
                 else:
                    print('user object created using class(createobject) is dead')
                    #what code can i put here to delete the object of this class?



在Python中,您无法手动销毁对象,Python使用自动内存管理。当一个对象不再被引用时,它就可以进行垃圾回收,在使用引用计数的CPython中,当引用计数达到零时,对象会立即被回收。 - juanpa.arrivillaga
不会的。再说一遍,当对象不再被引用时(在CPython中是这样工作的,但这并不是语言保证),它们将被有效地销毁。 - juanpa.arrivillaga
1
在某些情况下,x = Foo(); del x 可以删除由 Foo() 创建的对象的唯一引用。然而,并不总是那么简单。您不能直接操作引用计数(如果您足够努力,几乎任何事情都有可能,但这会导致非常糟糕的结果)。 - juanpa.arrivillaga
什么意思是“不再被引用”?既然它是一个while循环,它不会一直被引用吗?或者我应该加上“return”来停止函数。 - coderoftheday
你试图实现什么并不是很清楚,但是在任何 createobject 实例的方法正在运行时,你都不能删除它。 - Maurice Meyer
显示剩余6条评论
1个回答

23

这样想吧:你正在使用一个内部方法要求类自我销毁,这有点像试图咬自己的嘴。

幸运的是,Python具有垃圾回收功能,意味着一旦所有引用超出范围,您的类将被自动销毁。

如果需要在实例被销毁时执行特定操作,您仍然可以覆盖__del__()方法,它会有点像析构函数。这里有一个愚蠢的例子:

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...") 

现在,尝试在本地范围(如函数)中实例化该类:

def make_a_suicidal_class():
    my_suicidal_class = SelfDestruct()
    for i in range(5):
        my_suicidal_class.do_stuff()
    return None

在这里,对象的生命周期受函数限制。这意味着一旦调用完成,它将自动销毁。因此输出应该看起来像:

>>> 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!"
>>>
如果你的类在全局范围内被实例化,那么它只有在程序结束时才会被销毁。 另外需要注意的是,手动调用 __del__() 析构函数并不会真正销毁对象。这样做:
foo = SelfDestruct()
foo.__del__()
foo.do_stuff()

结果就是这个输出:

"Hi! I'm being instanciated!"
"I'm being automatically destroyed. Goodbye!"
"I'm doing some stuff..."

因此,该实例仍然存在... 如果您真的需要防止在当前范围内再次引用该实例,则必须调用 del foo

正如先前所述,Python 实际上对类和变量进行引用计数。因此,如果您的类对象在其他地方被使用,调用 del foo 实际上不会释放它所占用的内存。

这里是 Python 文档中详尽的说明:https://docs.python.org/2.5/ref/customization.html

“del x” 并未直接调用 x.del() —— 前者将 x 的引用计数减少一,只有当 x 的引用计数为零时才会调用后者。

长话短说:不要过多考虑!让 Python 处理内存管理。垃圾回收的整个目的就是停止担心变量的生命周期!


1
请耐心等待我尝试理解这个,谢谢你的支持。 - coderoftheday
2
谢谢!如果我的解释不够清楚,对不起。 - Oneiros
1
不,这很清楚!我只需要告诉我的大脑去理解。 - coderoftheday
如果我想要一个按钮来停止类的运行,该怎么办呢? - coderoftheday
根据你的实现而定,但据我所知,每当按下按钮时,您的类的一个新实例会在单独的线程中创建。如果这是期望的行为,则以下帖子可能会有所帮助: https://dev59.com/mYfca4cB1Zd3GeqPfzZH - Oneiros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接