Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 缓存对象在Django中重用_Python_Django_Caching - Fatal编程技术网

Python 缓存对象在Django中重用

Python 缓存对象在Django中重用,python,django,caching,Python,Django,Caching,我正在做一个Django项目,有一些类的实例。 我使用键“A”缓存了实例A,并在另一个请求中创建了一个新实例B。问题是实例B现在有实例A的数据。当我更改实例B的数据并从缓存中获取实例“A”时,实例A的数据也会更改 我想这与python的重用机制有关。有人知道如何解决这个问题吗 编辑1: 以下是我使用其名称创建类的方式: def create_model_by_name(name): name = name.capitalize() klass = globals()[name]

我正在做一个Django项目,有一些类的实例。 我使用键“A”缓存了实例A,并在另一个请求中创建了一个新实例B。问题是实例B现在有实例A的数据。当我更改实例B的数据并从缓存中获取实例“A”时,实例A的数据也会更改

我想这与python的重用机制有关。有人知道如何解决这个问题吗

编辑1: 以下是我使用其名称创建类的方式:

def create_model_by_name(name):
    name = name.capitalize()
    klass = globals()[name]
    instance = klass()
    return instance
我使用django.core.cache.cache来缓存对象

这是我在课堂上存储的一些数据。我从抽象继承了一些类

class Abstract:
    class_name = 'unknown'
    prev_text = []
    props = {}
    waiting_state = ''
    output = ''
    props_alias = {}
在这里:

所有这些属性都是类属性-它们属于类本身,而不是实例,并且在类的所有实例之间共享(除非被实例属性隐藏)

如果需要实例属性,则必须在
\uuuu init\uuu
方法中定义它们,即:

class Abstract:
    def __init__(self):
        self.class_name = 'unknown'
        self.prev_text = []
        self.props = {}
        self.waiting_state = ''
        self.output = ''
        self.props_alias = {}

如果您没有首先正确地学习Python,那么尝试使用Django可能会非常令人沮丧,并且假设Python的对象模型与Java或PHP类似,肯定会导致灾难。所以,帮你自己一个忙,先学习Python。

我想你的问题是像
prev_text=[]
props_alias={}
,因为这些列表和命令在所有实例中都是共享的。尝试将它们移动到
\uuuu init\uuu
方法中,如:

class Abstract:
    class_name = 'unknown'
    prev_text = None
    props = None
    waiting_state = ''
    output = ''
    props_alias = None

    def __init__(self):
        self.prev_text = []
        self.props = {}
        self.props_alias = {}

A和B是什么?它们是模型实例吗?你是如何创造它们的?如何缓存它们?显示一些代码。我更新了我的问题描述如何使用
django.core.cache.cache
?在您的示例中,您只是将实例存储为全局变量。这与缓存完全无关。将类和实例属性都使用相同的名称充其量也会造成混淆。如果希望某个对象成为实例属性,请仅将其定义为实例属性。这个类中使用了什么变得很清楚,所以您不需要通读方法2。您不会得到属性错误,因此,继续下去,您可以检查属性,如
if self.prev_text not None
,而不是
hasattr(self,'prev_text')
,这更干净。“1.类中使用的内容变得清晰,因此您不需要通读方法”=>False。每个pythoneer都希望在初始值设定项中定义实例属性,并在类级别定义类属性。您的“解决方案”只会让事情变得混乱,迫使我仔细检查每个属性,以确定它是否真的应该是类属性或实例属性。“2.您不会得到属性错误,因此,接下来,您可以检查属性,就像self.prev_text不是None一样”再次出错-如果您在初始值设定项中正确初始化了实例属性-这也是定义实例属性句点的正确方法-您将不会得到任何AttributeError.TL;医生:你做错了,并建议什么是不好的做法。谢谢。我刚从C++切换到Python,这是我的第一个项目。也许这是我的问题。谢谢你为我指出这一点。我认为你是对的,我应该更仔细地学习python。再次感谢你。
class Abstract:
    class_name = 'unknown'
    prev_text = None
    props = None
    waiting_state = ''
    output = ''
    props_alias = None

    def __init__(self):
        self.prev_text = []
        self.props = {}
        self.props_alias = {}