我对__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__()
在解释器退出时仍然为存在的对象调用方法。
Foo
存在解释器退出时存在的任何情况下,指示条都关闭?del foo
在gc.collect()
…或…上关闭?如果您想更好地控制这些细节(例如,在未引用对象时应关闭栏),通常的实现方法是什么?__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 foo
removes删除了最后一个引用,因此__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一样移除它。