当前位置: 首页 > 知识库问答 >
问题:

RecursionError:最大递归深度超过python属性getter setter[duplicate]

仉伟兆
2023-03-14

我试图在这个简单的类中做getter setter,

class Person:

    def __init__(self, n):
        self.name = n

    def get_name(self):
        return self.name

    def set_name(self, n):
        self.name = n

    name = property(get_name, set_name)


p = Person('Lewis')
p.name = 'Philo'

看起来很简单明了,但不知何故它不起作用,我错过了什么,帮我找到我出错的理解。

我得到以下错误。

Traceback (most recent call last):
  File "/Users/napoleon/python-play/oops/person.py", line 15, in <module>
    p = Person('Lewis')
  File "/Users/napoleon/python-play/oops/person.py", line 4, in __init__
    self.name = n
  File "/Users/napoleon/python-play/oops/person.py", line 10, in set_name
    self.name = n
  File "/Users/napoleon/python-play/oops/person.py", line 10, in set_name
    self.name = n
  File "/Users/napoleon/python-play/oops/person.py", line 10, in set_name
    self.name = n
  [Previous line repeated 994 more times]
RecursionError: maximum recursion depth exceeded

共有3个答案

罗诚
2023-03-14

这是因为类中的代码正在运行一个无限循环。

class Person:

    def __init__(self, n):
        self.name = n

    def get_name(self):
        return self.name

    def set_name(self, n):
        self.name = n

    name = property(get_name, set_name)


p = Person('Lewis')
p.name = 'Philo'

应该是:

class Person:

    def __init__(self, n):
        self.name = n

    def get_name(self):
        return self._name

    def set_name(self, n):
        self._name = n

    name = property(get_name, set_name)


p = Person('Lewis')
p.name = 'Philo'

额外的\uu可以避免运行无限循环。请参见,无论何时使用您提供的代码设置或获取名称,它都会永远运行set\u nameget\u name,因为您在getter或setter方法中设置或获取名称。

例如,使用p.name='Philo',您正在运行setter方法。然而,在setter方法中,您使用self.name=n一次又一次地调用setter方法,并执行自己。_name=n防止Python陷入无限循环。

鲜于仰岳
2023-03-14

每当你在Python中制作访问器和变异器时,你不应该对属性和属性使用相同的标记,所以你需要做的就是使用_< /code>来防止无限循环:

只要用self.\u name替换self.name,你就应该很好:

class Person:
    def __init__(self, n):
        self.name = n

    def get_name(self):
        return self._name

    def set_name(self, n):
        self._name = n

    name = property(get_name, set_name)

    p = Person('Lewis')
    p.name = 'Philo'
    
    print(p.get_name()) #prints "Philo"

东方新霁
2023-03-14

似乎是因为name是一个属性,当您调用self.name=n时,您使用get\u nameset\u name定义它实际上是调用属性的setter,即set\u name

初始化Person对象时,它调用\uuuuu init\uuuu,然后调用set\u name,因为它有一行self.name=n,同样的情况也发生在set\u name本身中(因为它有同一行)。

解决方案可能是创建一个_name成员,并在getter和setter中使用它。

在更复杂的情况下,您可以检查它是否没有保存发送给setter的值,然后才更改setter中成员的值。

class Person:
    _name = None
    def __init__(self, n):
        self._name = n

    def get_name(self):
        return self._name

    def set_name(self, n):
        self._name = n

    name = property(get_name, set_name)
 类似资料:
  • 我对Python很陌生。我写了一个关于返回 x 在排序的重复元素数组 A 中的出现次数的函数: 错误是:运行时错误:超出最大递归深度。有人知道如何解决它吗?

  • 问题内容: 我从星期一开始使用Python进行编程。我很喜欢学习它。但是我一直试图了解如何在tkinter菜单之间切换时避免递归!我确信这是一个非常基本的问题,感谢您宽容我对此主题的无知,但我无法在其他地方找到答案。 我现在正在做的最终是给我错误:RuntimeError:调用Python对象时超出了最大递归深度 这是我目前正在使用的模式。更新:下面的代码现在是完整的隔离副本,再现了我面临的问题!

  • 问题内容: 我使用以下代码解决了Euler项目的问题10,该代码通过强力工作: 这三个功能的工作方式如下: isPrime 检查数字是否为质数; primeList 返回一个列表,其中包含一组在一定范围内且限制为“ n”的素数,并且; sumPrimes 对列表中所有数字的值求和。(不需要最后一个功能,但是我喜欢它的清晰度,特别是对于像我这样的初学者。) 然后,我编写了一个新函数 primeLis

  • 我不明白为什么我会得到这个最大深度错误。iam试图使用bst递归方法在数组中查找数字索引,下面是我的代码 任何人都可以告诉我代码块中发生了什么 错误块: PS C:\Users\admin\Desktop\DSA

  • 这是我的代码: 首先,我从一个列表中做一个二叉查找树,并检查它是否是一个二叉查找树。 给定列表的第一个元素是根节点,后续元素成为子节点。到叶节点。 例如,调用 的结果为: 结果是二叉搜索树,因为左子节点小于父节点,右子节点大于父节点。因此,调用<code>bst_child</code>的结果是<code>True</code>。 然后我添加了寻找二叉查找树深度的代码。通过对第一个列表排序,我制作

  • 我似乎不知道如何使工作。如何修复此问题,使矩形继续向下移动?