Django奇怪的行为

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)