使用吸气和吸气剂的特性时,超过最大递归深度

问题描述 投票:0回答:1

我正在使用property()设置班级的getterssetters这是代码:

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)

此代码工作完美,但是当我在self._email中将self.email更改为set_email()时:

def set_email(self, value):
        self.email = value

我正在:

self.email =值[上一行重复494次]RecursionError:超出最大递归深度

我知道变量前有一个下划线表示该变量仅供内部使用。但是,即使在构造函数中使用了self._email,我也无法理解为什么需要使用self.email

谁能解释为什么会这样吗?

python python-3.x getter-setter
1个回答
0
投票

分配self.email将首先检查email是否是数据描述符,如果是,它将调用相应的setter函数,在您的情况下为set_email。因此,当您执行self.email = ...时,会有效地调用set_email(self, ...)。在__init__内这不是问题,但是在set_email内显然会导致无限递归。

© www.soinside.com 2019 - 2024. All rights reserved.