我试图在这个简单的类中做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
这是因为类中的代码正在运行一个无限循环。
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 name
或get\u name
,因为您在getter或setter方法中设置或获取名称。
例如,使用p.name='Philo'
,您正在运行setter方法。然而,在setter方法中,您使用self.name=n
一次又一次地调用setter方法,并执行自己。_name=n
防止Python陷入无限循环。
每当你在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"
似乎是因为name
是一个属性,当您调用self.name=n
时,您使用get\u name
和set\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>。 然后我添加了寻找二叉查找树深度的代码。通过对第一个列表排序,我制作
我似乎不知道如何使工作。如何修复此问题,使矩形继续向下移动?