Skip to main content
 首页 » 编程设计

python之python内部函数定义中的变量是什么

2025年05月04日14虾米哥

view.generic.base中view的django中有class定义

class View(object): 
    ... 
    def as_view(cls, **initkwargs): 
        """  
        Main entry point for a request-response process. 
        """ 
        ... 
 
        def view(request, *args, **kwargs): 
            self = cls(**initkwargs) 
            if hasattr(self, 'get') and not hasattr(self, 'head'): 
                self.head = self.get 
            self.request = request 
            self.args = args 
            self.kwargs = kwargs 
            return self.dispatch(request, *args, **kwargs) 
 
        # take name and docstring from class 
        update_wrapper(view, cls, updated=()) 
 
        # and possible attributes set by decorators 
        # like csrf_exempt from dispatch 
        update_wrapper(view, cls.dispatch, assigned=()) 
        return view 

它应该返回一个类似 view(request, *args, **kwargs) 的函数。 请注意,“def view”中有一个变量,即“cls”。

假设我们运行:

tmp = View.as_view(),tmp(request, *args, **kwargs) 怎么知道cls的值是多少?


这是简化的情况!!!!!!

像这样说 python 代码:

>>> def func1(a): 
...     def func2(b): 
...         c = a + b 
...         print c 
...     return func2 
...  
>>> func3 = func1(3) 
>>> func3(1) 
4 
>>> func4 = func1(4) 
>>> func3(1) 
4 
>>> func4(1) 
5 
>>> func3.a=5 
>>> func3(1) 
4 
>>> func1.a=5 
>>> func3(1) 
4 

实际上 func3 的 def 中的 'a' 是什么,func3 是如何得到它的?


更新 1:

感谢您的回答。问题没有完全表达。

我想,当我们调用 func3 = func1(3) 时,我们在程序中有两个对象,func1 的代码,被调用的 func1(3) 的对象(符号表)。

我的问题是:

  1. 是否存在通过调用代码 func1() 生成的 func2() 对象,或者 func3 的值只是指向生成的 func1(3) 成员的指针,即 func2() 的指令?

  2. 是func1(3)中调用func3(1)的a,还是func2()的对象?

请您参考如下方法:

您已经创建了一个 closure通过从另一个函数返回一个函数。

使用您的简化示例,只要 func2 继续存在,任何在范围内并从您的内部函数 func2 引用的变量都将保留在范围内。

因此,即使在 func1< 之后,func1 中声明的任何变量(包括 a 等函数参数)也始终可供 func2 访问 结束。

当 func2 运行时 a 的值将是您传递给 func1 以生成 func2 的特定实例的任何值