开发者社区> 问答> 正文

Python @variable。导致达到递归限制的setter ?

获取错误的方法调用是平铺的。路径= 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

下面是导致错误的tiles类的部分


    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达到了递归的极限。我的调试器显示,如果c == True或c == False:和self,代码在行与行之间循环。我不确定是什么导致了这个错误 问题来源StackOverflow 地址:/questions/59385311/python-variable-setter-causing-recursive-limit-to-be-reached

展开
收起
kun坤 2019-12-25 22:22:33 349 0
1 条回答
写回答
取消 提交回答
  • 因为path是属性的名称,所以需要一个单独的变量来存储实际的值;通常命名为_path(带下划线)。否则,你的getter会递归地调用自身setter也是如此;行自我。setter中的path = c是导致对setter的递归调用的原因,因为setter像self一样处理所有的赋值。路径= .... 下面是一个如何正确做这件事的例子:

    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。

    2019-12-25 22:22:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载