Python 为getter&;使用属性时超出了最大递归深度;二传手

Python 为getter&;使用属性时超出了最大递归深度;二传手,python,python-3.x,getter-setter,Python,Python 3.x,Getter Setter,我正在使用property()为类设置getter和setters 代码如下: 班级人员: 定义初始化(self,email=None): self.email=电子邮件 def set_电子邮件(自身、值): self.\u email=value def get_电子邮件(自我): 返回自己的电子邮件 电子邮件=属性(获取电子邮件、设置电子邮件) 如果名称=“\uuuuu main\uuuuuuuu”: 尝试: 联系人=个人(电子邮件=”abc@123") 例外情况除外,如e: 打印(e)

我正在使用
property()
为类设置
getter
setters
代码如下:

班级人员:
定义初始化(self,email=None):
self.email=电子邮件
def set_电子邮件(自身、值):
self.\u email=value
def get_电子邮件(自我):
返回自己的电子邮件
电子邮件=属性(获取电子邮件、设置电子邮件)
如果名称=“\uuuuu main\uuuuuuuu”:
尝试:
联系人=个人(电子邮件=”abc@123")
例外情况除外,如e:
打印(e)
此代码工作正常,但是,当我将
self.\u email
更改为
self.email
内部
设置\u email()
时:

def set_电子邮件(self,value):
self.email=value
我得到:

self.email=value
[上一行重复了494次]
递归错误:超过最大递归深度

我理解,变量前的一条下划线表示该变量仅供内部使用。
但是我不明白为什么我需要使用
self.\u email
,即使我在构造函数中使用了
self.email


有人能解释为什么会发生这种情况吗?

作业
self.email=…
将决定
email
是否为a,如果是,它将调用相应的setter函数,在您的案例中,这是
set\u email
。因此,当您执行
self.email=…
时,就会有效地调用
set\u email(self…)
。在
\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我知道变量前的一个下划线表示该变量仅供内部使用。这是一个错误的理解。@shaikmoeed使用一个前导下划线表示一个实现变量/属性/属性/方法。@Brunodesshuilliers否,它是按约定开发人员使用()。您能分享任何支持您的声明的链接吗?@shaikmoeed我没有说过有任何隐私强制措施-Python没有“隐私”-我说这个命名“表示”了一个用于实现的名称,客户端代码不应该(不是“不能”)使用它。这是一种惯例而不是严格的强制执行,这一事实并没有改变这种语义。就像所有的大写字母都表示(伪)常量一样,Python也没有符号常量的概念,但是一个大写字母表示您不应该重新绑定这个名称,也不应该改变它绑定的内容。@Brunodesshuilliers感谢您的解释。我的理解是…,这意味着,由于属性(get_email,set_email),
set_email
函数在构造函数中赋值时被调用,
self.email
在同一函数中赋值会导致递归吗?我说得对吗?