0

我的视图有装饰器,它创建新实例SomeClass并使用此参数调用原始视图函数。

def decorator(orig_func):
    def inner_func(request, *args, **kwargs):
        api = SomeClass(request)
        return orig_func(request, api, *args, **kwargs)

问题是内部的属性(变量)SomeClass似乎在许多请求中都是持久的——例如,当view_one它执行时,它会在 apu (SomeClass) 类中设置一些属性。在对这些属性的第二次请求中,view_two仍然使用第一次请求中的值进行设置。我怎样才能避免这种情况?我需要简单的解决方案。


这是SomeClass:

class SomeClass:
    some_variable = None

    def __init__(self,value):
        #self.some_variable = None

    def setVariable(self,value):
        self.some_variable = value

    def getVariable(self):
        return self.some_variable

我的问题是,当请求被执行并且被评论的行被评论时, some_variable 不是必需None的——它在之前的请求中设置了值。所以我写了这个注释行来“清除”变量。

现在我有一个问题 - 这安全吗?是否有可能在另一个请求执行期间一个请求将清除此变量,并在另一个请求中将其覆盖为 None?

4

1 回答 1

1

以下是您想要的正确类定义。

class SomeClass:
    def __init__(self,value):
        self.some_variable = value

    def setVariable(self,value):
        self.some_variable = value

    def getVariable(self):
        return self.some_variable

这将在对象上instance而不是在class对象上设置属性。

>>> a = SomeClass(5)
>>> a.some_variable # Just as expected
5
>>> b = SomeClass(10)
>>> b.some_variable # This is its own variable
10
>>> b.some_variable = 20 # This won't change 'a'
>>> a.some_variable # Hasn't changed
5

我可能还想注意这一点,getters并且setters在编写 python 时通常不想要你想要的,因为你可以instance.some_variable = 5在不需要 getter 或 setter 的情况下做到这一点。

于 2013-01-31T12:04:52.917 回答