属性setter触发无限递归,为什么



使用@property+setter封装,我需要一个在有人试图更改account_number时引发异常的类。但是,在__init__函数中,我需要设置该值。这是代码,它生成递归。

class SingleBankAccount:

def __init__(self, account_number, account_balance):
self.account_number = account_number
self.account_balance = account_balance

@property
def account_number(self):
return self.account_number

@account_number.setter
def account_number(self, number):
# if there is a number already, raise exception, otherwise set it
if self.account_number:
raise AccountException("Someone tried to change the account number!")
else:
self.account_number = number

这就是错误:

File "main.py", line 17, in account_number
if self.account_number:
File "main.py", line 13, in account_number
return self.account_number
File "main.py", line 13, in account_number
return self.account_number
File "main.py", line 13, in account_number
return self.account_number
[Previous line repeated 993 more times]
RecursionError: maximum recursion depth exceeded

请帮我理解原因。

您正在setter中设置self.account_number属性。正确的蟒蛇方式是使用";私人的";属性:

class SingleBankAccount:

def __init__(self, account_number, account_balance):
self.account_number = account_number
self.account_balance = account_balance

@property
def account_number(self):
return self._account_number

@account_number.setter
def account_number(self, number):
# if there is a number already, raise exception, otherwise set it
if hasattr(self, "_account_number"):
raise AccountException("Someone tried to change the account number!")
else:
self._account_number = number

hasattr是为了避免未设置属性的问题。

最新更新