首页 > 解决方案 > 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我不确定是什么导致了这个错误

标签: python

解决方案


由于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。


推荐阅读