使用@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是为了避免未设置属性的问题。