避免setattr的无限循环
时间: 2023-07-04 22:12:30 浏览: 60
禁止系统重复运行
在Python中,使用setattr()函数为对象设置属性时,有时会出现无限循环的情况。这种情况通常出现在一个属性的setter函数中,该函数又使用了setattr()来设置同一个对象的另一个属性。为了避免这种情况,我们可以使用一个标志来表示属性是否正在被设置,如果正在被设置,则不会再次调用setter函数,从而避免无限循环。以下是一个示例代码:
```
class MyClass:
def __init__(self):
self._flag = False
self._attr1 = None
self._attr2 = None
def set_attr1(self, value):
if not self._flag:
self._flag = True
self._attr1 = value
setattr(self, 'attr2', value * 2)
self._flag = False
def set_attr2(self, value):
if not self._flag:
self._flag = True
self._attr2 = value
setattr(self, 'attr1', value / 2)
self._flag = False
@property
def attr1(self):
return self._attr1
@attr1.setter
def attr1(self, value):
self.set_attr1(value)
@property
def attr2(self):
return self._attr2
@attr2.setter
def attr2(self, value):
self.set_attr2(value)
```
在上述代码中,我们使用了一个名为`_flag`的标志来表示属性是否正在被设置。当属性正在被设置时,我们将`_flag`设置为`True`,并在setter函数中检查该标志,如果为`True`,则不再调用setter函数,从而避免无限循环。
阅读全文