我想创建一个数据对象:
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)
此外,请勿使用可变对象作为默认参数,因为默认参数中的同一对象 {}
在 GameData
实例之间共享。
关于python - 如何正确使用__setitem__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61944707/