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 函数时,添加了验证是否存在此账户和验证密码的操作,如果出错就会引发异常,从而不会对被包装函数进行调用,达到了不让非法用户进行操作的目的。