格式一:装饰器外层不传参,内层传参
user_status = False # 用户登录了就把这个改成True def login(func): # 把要执行的henan模块从这里传进来 def inner(*args, **kwargs): # 再定义一层函数,参数为henan的参数 _username = "alex" # 假装这是DB里存的用户信息 _password = "abc!23" # 假装这是DB里存的用户信息 global user_status if user_status == False: username = raw_input("user:") password = raw_input("password:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: func(*args, **kwargs) # 看这里看这里,只要验证通过了,就调用相应功能 return inner # 用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数 @login #注意因为这里没有传参,所以没有括号 def henan(t): print "henan********,%s" %t henan("henan args")
运行结果--
user:alex
password:abc!23
welcome login....
henan********,henan args
格式一:装饰器外层传参,内层传参
user_status = False #用户登录了就把这个改成True def login(auth_type): #把要执行的参数从这里传进来 def auth(func): # 把要执行的henan模块从这里传进来 def inner(*args,**kwargs):#再定义一层函数 if auth_type == "qq": _username = "alex" #假装这是DB里存的用户信息 _password = "abc!23" #假装这是DB里存的用户信息 global user_status if user_status == False: username = raw_input("user:") password = raw_input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status == True: return func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能 else: print("only support qq ") return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数 return auth @login("qq") #注意这里传入参数给装饰器外层 def henan(t): print "henan********,%s" %t henan("henan args")
运行结果
user:alex
pasword:abc!23
welcome login....
henan********,henan args
应用场景一:登录验证
优点:
1、不会改变原先代码结构
2、不会改变原先的调用方式