python - Python @variable.setter 导致达到递归限制?
问题描述
得到错误的方法调用是tile.path = false
def createMaze():
def createTileMatrix():
for x in range(size):
for y in range(size):
tile = tiles.tiles()
tile.path = False
if(x == 0 or y == 0 or x == size - 1 or y == size -1):
tile.border = True
else:
tile.border = True
tile.wall = True
tile.lit = False
tile.string = False
tile.spawn = False
tileMatrix[x][y] = tile
下面是导致错误的tile类的一部分
path = None
wall = None
string = None
topLeftXCoord = None
topLeftYCoord = None
spawn = None
lit = None
border = None
sprite = None
@property
def path(self):
return self.path
@path.setter
def path(self, c):
if c == True or c == False:
self.path = c
else:
raise Exception("cannot set path equal to a non boolean function")
某些原因导致 Python 达到递归限制。我的调试器显示代码在行之间循环if c == True or c == False:
,self.path = c
我不确定是什么导致了这个错误
解决方案
由于path
是属性的名称,所以需要一个单独的变量来存储实际值;通常它会被命名_path
(带下划线)。否则,您的 getter 会递归调用自身,您的 setter 也会如此;setter 内的行self.path = c
是导致对 setter 的递归调用的原因,因为 setter 处理所有分配,例如self.path = ...
.
这是如何正确执行此操作的示例:
class Example:
def __init__(self, foo):
self.foo = foo
@property
def foo(self):
return self._foo
@foo.setter
def foo(self, value):
if value >= 0:
self._foo = value
else:
raise ValueError()
注意_foo
带下划线只需要在getter和setter中使用;其他方法,例如__init__
可以并且应该使用foo
(不带下划线)来调用 getter 或 setter。
推荐阅读
- python - 如何在 Jupiter notebook 中同时删除几行代码?
- c - 如何使用共享内存 C 语言在 struct 中启动动态数组
- python - 将多列乘以多列就地
- python - 有什么方法可以使 python 中的长迭代代码随着它们获取越来越多的信息而不会花费越来越长的时间来运行?
- vim - 如何从寄存器中输入多行命令?
- r - R中是否有一个函数来定义条件为真的时间段(在时间序列内)
- python - 如何从 pyplot 浮动轴中删除框架?
- python - Pandas、Python、数据缺失年份列
- c# - 为什么我的 JsonConvert 不能正确转换
- javascript - React Native:将新项目推送到数组后,FlatList 未更新