这可能是一个愚蠢的问题,但我是Python的新手。我想了解以下代码段是如何实现的。
class test:
def main_method(self):
variable = 10;
def sub_method(input):
return input * variable
self.result = sub_method
obj = test()
obj.main_method()
print(obj.result(4))
输出:
40
我的问题:
当我执行obj.result(4)
时,作为存储self.result
的实例变量的sub_method
如何能够访问main_method
的范围和{{1}的值没有再次执行variable
?
非常感谢你。
答案 0 :(得分:1)
这是可能的,因为Python函数支持closures:
在操作上,闭包是将函数[a]存储在一起的记录 环境:[1]关联每个自由变量的映射 函数(在本地使用但在。中定义的变量) 使用名称所在的值或引用括起scope) 在创建闭包时绑定。
事实上,在Python中,很容易对此进行反思。运行你的代码......
In [2]: class test:
...:
...: def main_method(self):
...:
...: variable = 10;
...:
...: def sub_method(input):
...:
...: return input * variable
...:
...: self.result = sub_method
...:
...: obj = test()
...:
...: obj.main_method()
...:
In [3]: obj.result
Out[3]: <function __main__.test.main_method.<locals>.sub_method>
基本上,每个函数都带有对它的自由变量的引用:
In [6]: obj.result.__closure__
Out[6]: (<cell at 0x10448ff78: int object at 0x100214990>,)
In [7]: obj.result.__closure__[0].cell_contents
Out[7]: 10
甚至它的自由变量的名称都是内省的:
In [8]: obj.result.__code__.co_freevars
Out[8]: ('variable',)
在Python中,函数只是另一种对象。