我正在研究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来缓存对象。
这是我存储在班级中的一些数据。我有一些继承自Abstract的类。
class Abstract:
class_name = 'unknown'
prev_text = []
props = {}
waiting_state = ''
output = ''
props_alias = {}
答案 0 :(得分:1)
这里:
class Abstract:
class_name = 'unknown'
prev_text = []
props = {}
waiting_state = ''
output = ''
props_alias = {}
所有这些属性都是类属性-它们属于类本身,而不是实例,并且在类的所有实例之间共享(除非被实例属性遮盖)。
如果需要实例属性,则必须在__init__
方法中定义它们,即:
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。
答案 1 :(得分:0)
我想您的问题是prev_text = []
,props_alias = {}
之类的东西,因为这些列表和字典在所有实例之间都是共享的。尝试将它们移至__init__
方法中,例如:
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 = {}