python如何删除对象_如何强制删除python对象?

关闭资源的方式是上下文管理器,也就是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)当Python的引用计数为0时,它的对象被删除。在你的例子中,del foo删除最后一个引用,因此__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

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__调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值