python - 如何正确使用__setitem__?

标签 python setattr

我想创建一个数据对象:

class GameData:
  def __init__(self, data={}):
    self.data = data

  def __getitem__(self, item):
    return self.data[item]

  def __setitem__(self, key, value):
    self.data[key] = value

  def __getattr__(self, item):
    return self.data[item]

  def __setattr__(self, key, value):
    self.data[kay] = value

  def __repr__(self):
    return str(self.data)

当我创建 GameData 对象时,出现 RecursionError。如何避免 setitem 调用自身?

最佳答案

在赋值 self.data = data 中,调用 __setattr__ 因为 self 没有名为 data 的属性眼下。 __setattr__ 然后调用__getattr__ 来获取不存在的属性data__getattr__ 本身再次调用 __getattr__。这是一个递归。

在实现__setattr__时,使用object.__setattr__(self, 'data', data)进行赋值。

class GameData:
  def __init__(self, data=None):
    object.__setattr__(self, 'data', {} if data is None else data)

  def __getitem__(self, item):
    return self.data[item]

  def __setitem__(self, key, value):
    self.data[key] = value

  def __getattr__(self, item):
    return self.data[item]

  def __setattr__(self, key, value):
    self.data[key] = value

  def __repr__(self):
    return str(self.data)

详情参见 the __getattr__ manual

此外,请勿使用可变对象作为默认参数,因为默认参数中的同一对象 {}GameData 实例之间共享。

关于python - 如何正确使用__setitem__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61944707/

相关文章:

python - 给定包含 "triplets"RGB 值的 2D numpy arrayMatrix,如何生成图像?

python - Pandas groupby fillna 具有第一个有效值(窗口函数)

python - __getattr__ 在实现 __setattr__ 时抛出最大递归错误

python - 对于私有(private)属性,setattr 和赋值并不等效

python - Django - 过滤ManyToManyField?

python - 如何使用plot_trisurf

Python 正则表达式语句

python - 为什么具有重新定义的 __getattr__() 的对象会抛出 TypeError?

Python:将 init args 干净地解压到成员变量中

python - 如何在我的函数中替换 `eval`?