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) 的对象(符号表)。
我的问题是:
是否存在通过调用代码 func1() 生成的 func2() 对象,或者 func3 的值只是指向生成的 func1(3) 成员的指针,即 func2() 的指令?
是func1(3)中调用func3(1)的a,还是func2()的对象?
请您参考如下方法:
您已经创建了一个 closure通过从另一个函数返回一个函数。
使用您的简化示例,只要 func2 继续存在,任何在范围内并从您的内部函数 func2 引用的变量都将保留在范围内。
因此,即使在 func1< 之后, 结束。func1 中声明的任何变量(包括 a 等函数参数)也始终可供 func2 访问
当 func2 运行时 a 的值将是您传递给 func1 以生成 func2 的特定实例的任何值
