1. 装饰器
装饰器的作用就是在不修改源代码,通过添加注解的方式实现功能的扩展。
下面以给boy(),girl(),luxury()业务方法添加登录方法为例,通过添加注解实现功能扩展(闭包),添加注解本质是返回了一个嵌套函数内部函数的内存地址,由于不同业务方法传入的参数不同,所以需要在嵌套函数的内部添加 *args,**kwargs来接收不同类型的非固定参数。
account = {
"username": "kelly", # 用户登录了就把这个改成True
"password": "LiJun123@", # 假装这是DB里存的用户信息
"auth": False # 假装这是DB里存的用户信息
}
def login(fuc):
def inner(*args, **kwargs): # 再定义一层函数
if account["auth"] is False:
username = input("user:")
password = input("pasword:")
if username == account["username"] and password == account["password"]:
print("welcome login....")
account["auth"] = True
else:
print("wrong username or password!")
if account["auth"] is True:
fuc(*args, **kwargs)
return inner # 注意这里只返回inner的内存地址,不执行
def home():
print("-----欢迎来到首页-----")
def girl():
print("-----欢迎来到女装板块------")
@login
def boy():
print("-----欢迎来到男装板块------")
@login
def luxury(vip):
if vip > 3:
print("-----欢迎来到奢侈品vip区------")
else:
print("----欢迎来到普通奢侈品区-------")
home()
# luxury=login(luxury) # 这次执行login返回的是inner的内存地址 .inner at 0x101762840>
# boy=login(boy) # .inner at 0x102562840> 这句话可以在boy方法上简写成@login
luxury(4)
boy()
2.装饰器运行结果
不同的业务函数可以传入不同的参数,本质是因为嵌套函数内部添加了两个不固定参数实现的扩展,由于luxury()传入的参数>3,所以会打印"欢迎来到奢侈品vip区",boy()没有传入任何参数,也就没有判断之分,直接打印"欢迎来到男装板块"