Ter*_*mos 0 python django class-variables
我在Django中有一个调用外部库/类的视图.问题是由于某些原因,Django保持缓存来自该类之前调用的结果.
请考虑以下简单示例:
Django视图:
from some_path import Demo
def test_view(request):
demo = Demo()
result = demo.do_something()
return render(request, 'test.html',
{ 'result':result }
)
Run Code Online (Sandbox Code Playgroud)
演示课:
class Demo():
result = []
def do_something(self):
self.result.append(1)
self.result.append(2)
self.result.append(3)
return self.result
Run Code Online (Sandbox Code Playgroud)
你期望结果是[1,2,3],对吗?错误!
第一次加载页面时,您将获得正确的结果.但是在以下所有请求中它将继续递增:[1,2,3,1,2,3] ...... [1,2,3,1,2,3,1,2,3] ......
所以我的问题很明显 - 这里发生了什么?每次我在Django视图中调用一个类时,我如何收到[1,2,3]?
Django 1.7/MacOS X.
Vis*_*yay 11
定义result中__init__作为一个实例属性.
class Demo():
def __init__(self):
self.result = []
def do_something(self):
self.result.append(1)
self.result.append(2)
self.result.append(3)
return self.result
Run Code Online (Sandbox Code Playgroud)
如果您result在代码中打印,那么您result只需分配一次,
class Demo():
result = []
print result
def ...
.
.
d = Demo()
print d.do_something()
print d.do_something()
e = Demo()
print e.do_something()
>>>
[]
[1, 2, 3]
[1, 2, 3, 1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
result是一个可变对象,每当你创建一个类的实例时,它引用result相同的引用.如果是Immutable对象: -
class Demo():
result = 1
def do_something(self):
self.result += 1
d = Demo()
d.do_something()
d.do_something()
e = Demo()
e.do_something()
print d.result, e.result
Run Code Online (Sandbox Code Playgroud)
输出: -
>>>
3 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |