c = C() (实例化对象的时候)
我来了~
del c (调用del语句把它删除的时候,但是必须检测到一个对象没有任何引用的时候,才会将它销毁)
我走了~
c = C()
我来了~
d = c (做一个引用给d)
del c (此时,del c没有用)
del d (但是这个引用d被销毁,c才会被销毁)
我走了~
二、__del__是对象销毁前的最后拦截,有没有利用这个实现对象的重生,__del__方法可以通过创建一个该实例的新引用,来推迟其销毁,这也被称为对象的重生,虽然官方不建议,但它又告诉你可以实现,不妨尝试一下,虽然对象随着__del__语句删除了,这没错,但是如果能够在对象被销毁之前将self送出去,那么这个对象就算是得以重生了。
class D:
def __init__(self,name):
self.name = name
def __del__(self): (方法其实也是一个函数,只是多了一个对象绑定的操作和参数)
global x (创建一个全局变量x)
x = self (然后x=self)
d = D("小姐姐")
d
<__main__.D object at 0x000001EA934014F0>
d.name
'小姐姐'
del d
d
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
d
NameError: name 'd' is not defined. Did you mean: 'D'?
x
<__main__.D object at 0x000001EA934014F0>
x.name
'小姐姐'
我们在讲全局变量的时候,非迫不得已,尽量不要使用全局变量,因为它会污染命名空间,那么我们就要考虑,会不会有另一种方法:是不是可以在对象被销毁之前,让它去调用一个函数,然后通过参数传递的形式将self给传出去。所以还有一种方法:通过函数调用的形式,将这个对象,将这个self保存起来)
class E:
def __init__(self,name,func):
self.name = name
self.func = func
def __del__(self):
self.func(self)
def outter(): (定义一个闭包函数,)
x = 0
def inner(y=None):
nonlocal x
if y:
x = y
else:
return x
return inner
f = outter()
e = E("小姐姐",f)
e
<__main__.E object at 0x000001EA93401AF0>
e.name
'小姐姐'
del e
e
Traceback (most recent call last):
File "<pyshell#60>", line 1, in <module>
e
NameError: name 'e' is not defined. Did you mean: 'E'?
g = f()
g
<__main__.E object at 0x000001EA93401AF0>
g.name
'小姐姐' (小姐姐又复活了)