Python 缓存对象在Django中重用
我正在做一个Django项目,有一些类的实例。 我使用键“A”缓存了实例A,并在另一个请求中创建了一个新实例B。问题是实例B现在有实例A的数据。当我更改实例B的数据并从缓存中获取实例“A”时,实例A的数据也会更改 我想这与python的重用机制有关。有人知道如何解决这个问题吗 编辑1: 以下是我使用其名称创建类的方式: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]
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 = {}