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