当前位置: 首页 > 面试题库 >

如何强制删除python对象?

卢黎昕
2023-03-14
问题内容

我对__del__python中的详细信息,何时以及为什么使用它以及不应该使用它的细节感到好奇。我已经学到了一种很难的方法,即它不是真的与析构函数的幼稚期望一样,因为它不是__new__/的反义词__init__

class Foo(object):

    def __init__(self):
        self.bar = None

    def open(self):
        if self.bar != 'open':
            print 'opening the bar'
            self.bar = 'open'

    def close(self):
        if self.bar != 'closed':
            print 'closing the bar'
            self.bar = 'close'

    def __del__(self):
        self.close()

if __name__ == '__main__':
    foo = Foo()
    foo.open()
    del foo
    import gc
    gc.collect()

我在文档中看到, 不能 保证__del__()在解释器退出时仍然为存在的对象调用方法。

  1. 如何保证在Foo存在解释器退出时存在的任何情况下,指示条都关闭?
  2. 在上面的代码片段中,该条是否del foogc.collect()…或…上关闭?如果您想更好地控制这些细节(例如,在未引用对象时应关闭栏),通常的实现方法是什么?
  3. 什么时候__del__可以保证__init__已经被调用?如果__init__加薪怎么办?

问题答案:

关闭资源的方法是上下文管理器,又称with语句:

class Foo(object):

  def __init__(self):
    self.bar = None

  def __enter__(self):
    if self.bar != 'open':
      print 'opening the bar'
      self.bar = 'open'
    return self # this is bound to the `as` part

  def close(self):
    if self.bar != 'closed':
      print 'closing the bar'
      self.bar = 'close'

  def __exit__(self, *err):
    self.close()

if __name__ == '__main__':
  with Foo() as foo:
    print foo, foo.bar

输出:

opening the bar
<__main__.Foo object at 0x17079d0> open
closing the bar

2)当它们的引用计数为0时,Python的对象将被删除。在您的示例中,del fooremoves删除了最后一个引用,因此__del__即刻被调用。GC不参与其中。

class Foo(object):

    def __del__(self):
        print "deling", self

if __name__ == '__main__':
    import gc
    gc.disable() # no gc
    f = Foo()
    print "before"
    del f # f gets deleted right away
    print "after"

输出:

before
deling <__main__.Foo object at 0xc49690>
after

gc没有任何与删除您和其他大多数的对象。由于自引用或循环引用而无法进行简单的引用计数时,可以在此进行清理:

class Foo(object):
    def __init__(self, other=None):
        # make a circular reference
        self.link = other
        if other is not None:
            other.link = self

    def __del__(self):
        print "deling", self

if __name__ == '__main__':
    import gc
    gc.disable()   
    f = Foo(Foo())
    print "before"
    del f # nothing gets deleted here
    print "after"
    gc.collect()
    print gc.garbage # The GC knows the two Foos are garbage, but won't delete
                     # them because they have a __del__ method
    print "after gc"
    # break up the cycle and delete the reference from gc.garbage
    del gc.garbage[0].link, gc.garbage[:]
    print "done"

输出:

before
after
[<__main__.Foo object at 0x22ed8d0>, <__main__.Foo object at 0x22ed950>]
after gc
deling <__main__.Foo object at 0x22ed950>
deling <__main__.Foo object at 0x22ed8d0>
done

3)让我们看看:

class Foo(object):
    def __init__(self):

        raise Exception

    def __del__(self):
        print "deling", self

if __name__ == '__main__':
    f = Foo()

给出:

Traceback (most recent call last):
  File "asd.py", line 10, in <module>
    f = Foo()
  File "asd.py", line 4, in __init__
    raise Exception
Exception
deling <__main__.Foo object at 0xa3a910>

使用创建对象,__new__然后将其传递给__init__as self。在中出现异常__init__,该对象通常将没有名称(即该f =部件未运行),因此其引用计数为0。这意味着该对象将被正常删除并被__del__调用。



 类似资料:
  • 我们执行以下步骤以删除主题-hgpo.llo.prmt.processed 但即使在12小时后,主题文件夹仍未从/var/kafka/kafka-logs中删除 注意-我们set-delete.topic.enable=true 在/var/kafka/kafka-logs下,我们有许多主题文件夹,如: ..

  • 问题内容: 我正在使用python删除和更新根据用户提供的数据生成的JSON文件,因此数据库中应仅存储少量项目。我想从JSON文件中删除特定对象。 我的JSON文件是: 我想使用删除JSON对象 。 由于我是python的新手,所以我尝试通过将对象转换为dict来删除它,但它不起作用。还有其他方法吗?我尝试了这个: 问题答案: 这是一个完整的示例,该示例加载JSON文件,删除目标对象,然后将更新的

  • 我使用python删除和更新从用户提供的数据生成的JSON文件,这样只需要在数据库中存储很少的项。我想从JSON文件中删除一个特定的对象。 我想删除带有的JSON对象。 由于我是python新手,我试图通过将对象转换为dict来删除它,但它不起作用。还有别的办法做吗?我试过这个:

  • 在发出delete操作之前,我必须在表行上更新这些信息(before delete触发器将负责从表中复制相关数据)。当我尝试从hibernate保存并删除时,hibernate将完全跳过保存。当然...假设如果要删除实体,那么执行保存操作是没有意义的,这是有意义的....但这不是我刚才告诉你的情况。 在执行删除之前提交事务可能会成功,但这意味着需要一个新的事务,加上我正在处理的更多对象必须重新加载

  • 我有k8s集群与吊舱,部署等。我正在使用helm来部署我的应用程序。我想删除所有部署和使用下面的命令 如果我看看我的豆荚的状态,我会看到有在终止状态,问题是这需要时间。有没有什么方法可以像立即用一些力量旗帜或somthing一样移除它。