|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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还保存在函数中,主要是这一句话对吗?
请大神指教,谢谢。
您的理解基本上是正确的。让我们逐步分解这个代码,以便更好地理解发生的事情。
- 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。
|
|