对 getter 和 setter 使用 属性 时超出了最大递归深度
Maximum recursion depth exceeded while using Property for getters & setters
我使用 property()
设置 getters
,使用 setters
设置 Class
这是代码:
class Person:
def __init__(self, email=None):
self.email = email
def set_email(self, value):
self._email = value
def get_email(self):
return self._email
email = property(get_email, set_email)
if __name__ == "__main__":
try:
contact = Person(email="abc@123")
except Exception as e:
print(e)
这段代码工作完美,但是,当我在 set_email()
中将 self._email
更改为 self.email
时:
def set_email(self, value):
self.email = value
我得到:
self.email = value
[Previous line repeated 494 more times]
RecursionError: maximum recursion depth exceeded
我了解变量前的单个 下划线 表示该变量仅供内部使用。
但是我不明白为什么我需要使用 self._email
即使我在构造函数中使用了 self.email
谁能解释为什么会这样?
赋值 self.email = ...
将 first check whether email
is a data-descriptor,如果是,它将调用相应的 setter 函数,在您的例子中是 set_email
。因此,当您执行 self.email = ...
时,实际上会调用 set_email(self, ...)
。在 __init__
内这不是问题,但在 set_email
内这显然会导致无限递归。
我使用 property()
设置 getters
,使用 setters
设置 Class
这是代码:
class Person:
def __init__(self, email=None):
self.email = email
def set_email(self, value):
self._email = value
def get_email(self):
return self._email
email = property(get_email, set_email)
if __name__ == "__main__":
try:
contact = Person(email="abc@123")
except Exception as e:
print(e)
这段代码工作完美,但是,当我在 set_email()
中将 self._email
更改为 self.email
时:
def set_email(self, value):
self.email = value
我得到:
self.email = value
[Previous line repeated 494 more times]
RecursionError: maximum recursion depth exceeded
我了解变量前的单个 下划线 表示该变量仅供内部使用。
但是我不明白为什么我需要使用 self._email
即使我在构造函数中使用了 self.email
谁能解释为什么会这样?
赋值 self.email = ...
将 first check whether email
is a data-descriptor,如果是,它将调用相应的 setter 函数,在您的例子中是 set_email
。因此,当您执行 self.email = ...
时,实际上会调用 set_email(self, ...)
。在 __init__
内这不是问题,但在 set_email
内这显然会导致无限递归。