6. 装饰器应用案例之权限管理
目标
使用装饰器实现权限管理规则,对银行存钱(savemoney)和取钱(withdraw)业务的实际操作函数的调用进行管理。
示例代码
# 装饰器应用案例之权限管理
bank_account = {
'魏明择': {'password': '123456', 'money': 500},
'小张': {'password': '654321', 'money': 10000},
}
def privileged_check(fn):
'权限管理装饰器'
def wrap(name, x):
if name not in bank_account:
raise ValueError(f'账户异常')
password = input(f'请输入{name}的密码: ')
if password != bank_account[name]['password']:
raise ValueError(f'账户异常')
return fn(name, x)
return wrap
@privileged_check
def savemoney(name, x): # 存钱
bank_account[name]['money'] += x
print(name, "存钱", x, "元。")
@privileged_check
def withdraw(name, x): # 取钱
bank_account[name]['money'] -= x
print(name, "取钱", x, "元。")
print('原来的银行账户:', bank_account)
savemoney("魏明择", 200)
savemoney("小张", 20000)
withdraw("魏明择", 300)
print('现在的银行账户:', bank_account)
上述程序中,bank_account 是模拟银行账户信息,键是账户名称,'password' 是账户密码,'money' 的值是账户余额。
装饰器在为调用存钱 savemoney 和取钱 withdraw 函数时,添加了验证是否存在此账户和验证密码的操作,如果出错就会引发异常,从而不会对被包装函数进行调用,达到了不让非法用户进行操作的目的。