我试着在这个简单的课堂上做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
无论何时在Python中创建访问器和变异器,都不应该对属性和属性使用相同的标记,因此只需使用
_
来防止无限循环:只要用
self._name
替换self.name
,你就应该很好:这是因为类中的代码正在运行一个无限循环
应该是:
额外的
_
是为了避免运行无限循环。请参见,无论何时使用提供的代码设置或获取名称,它都会永远运行set_name
或get_name
,因为您正在getter或setter方法中设置或获取名称例如,使用
p.name = 'Philo'
,您正在运行setter方法。但是,在setter方法中,使用self.name = n
一次又一次地调用setter方法,并且执行self._name = n
可以防止Python出现无限循环似乎因为
name
是一个属性,所以在调用get_name
和set_name
时,您使用get_name
和set_name
定义了它。它实际上调用了属性的setter,即set_name
初始化Person对象时,它调用
__init__
,然后调用set_name
,因为它有一行self.name = n
,同样的情况发生在set_name
本身(因为它有相同的行)解决方案可能是创建一个
_name
成员并在getter和setter中使用它在更复杂的情况下,您可以检查它是否没有保存发送给setter的值,然后才更改setter中成员的值
相关问题 更多 >
编程相关推荐