在学习 Python 面向对象编程时,我通过实现一个 `BankAccount` 类来理解只读属性、异常抛出和处理等关键概念。以下是整理的学习内容:
一、创建 BankAccount 类
初始需求包括定义账号和余额,并实现存款和取款功能。下面是类的实现:
class BankAccount:
def __init__(self, acct_num, bal=0):
self._acct_num = acct_num
self._bal = bal
@property
def acct_num(self):
return self._acct_num
@property
def bal(self):
return self._bal
def deposit(self, amt):
if amt <= 0:
raise ValueError("存款金额需大于0")
self._bal += amt
def withdraw(self, amt):
if amt <= 0:
raise ValueError("取款金额需大于0")
if amt > self._bal:
raise ValueError("余额不足")
self._bal -= amt
def get_bal(self):
return self._bal
二、实现只读属性
为了确保某些属性只能读不能写,可以使用 `@property` 装饰器。
例如,对于账户号码:
account = BankAccount("12345", 500)
print(account.acct_num) # 输出: 12345
# account.acct_num = "67890" # 这行代码会报错
三、业务逻辑与错误处理
修正了存款方法中的逻辑错误,存款应增加余额,而非减少。
四、使用 raise 和 try/except
使用 `raise` 抛出异常比简单打印信息更有利于程序控制流管理。
示例:
try:
account.deposit(-100)
except ValueError as e:
print(e) # 输出: 存款金额需大于0
五、自定义异常
定义自己的异常类型可以使错误消息更加明确。
class LowBalanceError(Exception):
pass
def withdraw(self, amt):
if amt > self._bal:
raise LowBalanceError("账户余额不足")
self._bal -= amt
六、完整示例
下面是一个完整的例子,结合了上述所有知识点:
class BankAccount:
def __init__(self, acct_num, bal=0):
self._acct_num = acct_num
self._bal = bal
@property
def acct_num(self):
return self._acct_num
@property
def bal(self):
return self._bal
def deposit(self, amt):
if amt <= 0:
raise ValueError("存款金额必须大于0")
self._bal += amt
def withdraw(self, amt):
if amt <= 0:
raise ValueError("取款金额必须大于0")
if amt > self._bal:
raise ValueError("余额不足")
self._bal -= amt
def get_bal(self):
return self._bal
account = BankAccount("12345", 1000)
try:
account.deposit(500)
account.withdraw(1500)
except ValueError as e:
print("操作失败:", e)
else:
print("操作成功,当前余额:", account.get_bal())
finally:
print("交易结束")