我正在开发一个多人游戏。当我使用库存中的对象时,它应该使用对象属性的值更新用户生物的统计数据。
这是我的代码:
try:
obj = self._get_obj_by_id(self.query['ObjectID']).first()
# Get user's current creature
cur_creature = self.user.get_current_creature()
# Applying object attributes to user attributes
for attribute in obj.attributes:
cur_creature.__dict__[str(attribute.Name)] += attribute.Value
dbObjs.session.commit()
except (KeyError, AttributeError) as err:
self.query_failed(err)
现在,由于某种原因,这并没有正确提交,所以我尝试了:
cur_creature.Health = 100
logging.warning(cur_creature.Health)
dbObjs.session.commit()
哪个有效,但不是很方便(因为我需要一个大的 if 语句来更新生物的不同统计数据)
所以我尝试了:
cur_creature.__dict__['Health'] = 100
logging.warning(cur_creature.Health)
dbObjs.session.commit()
我进入100
日志,但没有任何变化,所以我尝试了:
cur_creature.__dict__['Health'] = 100
cur_creature.Health = cur_creature.__dict__['Health']
logging.warning(cur_creature.Health)
dbObjs.session.commit()
日志中仍然是“100”,但没有变化,所以我尝试了:
cur_creature.__dict__['Health'] = 100
cur_creature.Health = 100
logging.warning(cur_creature.Health)
dbObjs.session.commit()
它仍然在日志中写入 100,但不提交对数据库的更改。现在,这很奇怪,因为它仅因工作版本不同而不同,因为它在顶部有这一行:
cur_creature.__dict__['Health'] = 100
摘要:如果我直接修改属性,提交工作正常。相反,如果我通过类的字典修改属性,那么,无论我之后如何修改它,它都不会将更改提交到数据库。
有任何想法吗?
提前致谢
更新 1:
此外,这会更新数据库中的 Health,但不会更新 Hunger:
cur_creature.__dict__['Hunger'] = 0
cur_creature.Health = 100
cur_creature.Hunger = 0
logging.warning(cur_creature.Health)
dbObjs.session.commit()
因此,对于一般属性而言,仅访问字典不是问题,但通过字典修改属性会阻止对该属性的更改被提交。
更新 2:
作为临时修复,我已经覆盖了__set_item__(self)
类中的函数Creatures
:
def __setitem__(self, key, value):
if key == "Health":
self.Health = value
elif key == "Hunger":
self.Hunger = value
所以“使用对象”的新代码是:
try:
obj = self._get_obj_by_id(self.query['ObjectID']).first()
# Get user's current creature
cur_creature = self.user.get_current_creature()
# Applying object attributes to user attributes
for attribute in obj.attributes:
cur_creature[str(attribute.Name)] += attribute.Value
dbObjs.session.commit()
except (KeyError, AttributeError) as err:
self.query_failed(err)
更新 3:
通过查看答案中的建议,我确定了这个解决方案:
在Creatures
def __setitem__(self, key, value):
if key in self.__dict__:
setattr(self, key, value)
else:
raise KeyError(key)
在另一种方法
# Applying object attributes to user attributes
for attribute in obj.attributes:
cur_creature[str(attribute.Name)] += attribute.Value