spflmm 发表于 2023-4-12 17:24:54

对象删除后重生问题

>>> class E:
...   def __init__(self, name, func):
...         self.name = name
...         self.func = func
...   def __del__(self):
...         self.func(self)
>>> def outer():
...   x = 0
...   def inner(y=None):
...         nonlocal x
...         if y:
...             x = y
...         else:
...             return x
...   return inner
>>> f = outer()
>>> e = E("小甲鱼", f)
>>> e
<__main__.E object at 0x0000024775760790>
>>> e.name
'小甲鱼'
>>> del e
>>> e
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
    e
NameError: name 'e' is not defined
>>> g = f()
>>> g
<__main__.E object at 0x0000024775760790>
>>> g.name
'小甲鱼'

有点弄不明白了, f = outer(), outer()执行的结果为返回 inner,f就相当于inner,执行del e时会触发 def __del__(self): self.func(self),触发后的结果是inner(self),这个时候y = self,执行测结果就是就是将self赋值给了x,就是x=self。执行完前面的这些后,外层函数outer的变量x还保存在函数中, 然后 g = f(),就相当于g=inner(),这个时候 outer()的外层变量x是self,内层变量y就是默认值None,所以 f()的返回值就是self,这样理解对吗?执行完前面的这些后,外层函数outer的变量x还保存在函数中,主要是这一句话对吗?
请大神指教,谢谢。

isdkz 发表于 2023-4-12 17:27:45

您的理解基本上是正确的。让我们逐步分解这个代码,以便更好地理解发生的事情。


[*]f = outer():outer() 函数返回 inner 函数,所以现在 f 就是 inner 函数。
[*]创建 E 类的对象 e: e = E("小甲鱼", f),将 name 设置为 "小甲鱼",并将 func 设置为 f,即 inner 函数。
[*]del e:删除 e 对象。在删除 E 类的对象时,__del__() 方法被调用。在这个例子中,__del__() 方法调用 self.func(self),即调用 inner 函数并传入当前对象 self 作为参数。此时 y 参数为 self,x 被赋值为 self。
[*]g = f():此时调用 inner() 函数,由于没有提供参数,y 参数为默认值 None。因为 x 被赋值为 self,inner() 函数返回 x,即返回 self。因此,g 被赋值为 self,即 E 类的实例。
[*]所以,执行完前面的这些后,外层函数 outer 的变量 x 仍然保存在函数中。这是因为在 Python 中,闭包允许嵌套函数引用外部函数的变量。在这个例子中,inner 函数作为闭包,可以访问并修改外部函数 outer 的变量 x。

spflmm 发表于 2023-4-12 17:30:20

谢谢大神!
页: [1]
查看完整版本: 对象删除后重生问题