销毁类python的对象

cod*_*day 0 python oop class object self

嗨,如果满足 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?


Run Code Online (Sandbox Code Playgroud)

One*_*ros 8

可以这样想:您正在要求一个类使用内部方法自毁,这有点像试图吃掉自己的嘴。

幸运的是,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...") 
Run Code Online (Sandbox Code Playgroud)

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

def make_a_suicidal_class():
    my_suicidal_class = SelfDestruct()
    for i in range(5):
        my_suicidal_class.do_stuff()
    return None
Run Code Online (Sandbox Code Playgroud)

在这里,对象的生命周期受函数的约束。这意味着它会在调用完成后自动销毁。因此,输出应如下所示:

>>> 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!"
>>>
Run Code Online (Sandbox Code Playgroud)

如果您的类是在全局范围内实例化的,那么在您的程序结束之前它不会被销毁。

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

foo = SelfDestruct()
foo.__del__()
foo.do_stuff()
Run Code Online (Sandbox Code Playgroud)

结果是这个输出:

"Hi! I'm being instanciated!"
"I'm being automatically destroyed. Goodbye!"
"I'm doing some stuff..."
Run Code Online (Sandbox Code Playgroud)

ergo,该实例仍然有一个脉冲...如果您确实需要防止在当前范围内再次引用该实例,则必须调用del foo才能这样做。

尽管如前所述,Python 实际上对类和变量进行了引用计数。因此,如果您的类对象用于 elsewere,则调用del foo实际上不会从内存中释放它。

这是 python 文档https://docs.python.org/2.5/ref/customization.html 中的详尽解释

“del x”不直接调用 x。del () -- 前者将 x 的引用计数减一,后者仅在 x 的引用计数达到零时调用。

长话短说:别想了!让python处理内存管理。垃圾收集的全部意义在于不要担心变量的生命周期!

  • 干杯! 抱歉,如果我的解释不够清楚。 (2认同)