鱼C论坛

 找回密码
 立即注册
查看: 1931|回复: 2

[已解决]对象删除后重生问题

[复制链接]
发表于 2023-4-12 17:24:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> 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还保存在函数中,主要是这一句话对吗?
请大神指教,谢谢。
最佳答案
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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-12 17:30:20 | 显示全部楼层
谢谢大神!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 10:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表