对 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 内这显然会导致无限递归。