类方法中的这个函数如何在Python中工作?

时间:2017-05-23 23:23:04

标签: python class object methods

这可能是一个愚蠢的问题,但我是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

非常感谢你。

1 个答案:

答案 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中,函数只是另一种对象。