python 装饰器
闭包
def fun1(): n = 10 def fun2(): print("n为", n) return fun2 f = fun1() print(f) f()
闭包的概念:在内部可以调用外部函数和这个外部函数所属作用域内的变量值
装饰器的作用:可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
1.没有加参数的装饰器
user_status = False
def login(func):#第一次执行login方法时,将老河南的方法保存在了func中 def inner():#装饰器可以随便加多少参数 _username = "alex" # 假装这是DB里存的用户信息 _password = "abc!23" # 假装这是DB里存的用户信息 global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status: print("用户已登录,验证通过...",func) func()#此时执行的func为一开始存储的老河南方法 # print(func) # print(inner) return inner def home(): print("---首页----") def america(): print("----欧美专区----") def japan(): print("----日韩专区----") def henan(): print("----河南专区----") henan = login(henan)#此时为inner方法的地址 print(henan)#此时为新河南 henan()#为inner
思路分析:
第一步会执行login(henan)函数,返回inner的内存地址,此时新henan为inner的内存地址,此时的func为老河南的方法。
第二步执行inner函数,当用户名输入正确时会执行func函数,此时执行老河南的方法,最后输出老河南函数中的内容。
2.加一个参数的装饰器
Staus = False def login(func): def inner(ss): name = "gaohui" passwd = "1234" global Staus if Staus == False: username = input("请输入名字:").strip() password = input("请输入密码:").strip() if username == name and password == passwd: #print("欢迎") Staus = True else: print("用户或密码错误") if Staus : print("欢迎") func(ss) return inner @login def henan(style): print("欢迎河南") @login def Japan(style): print("欢迎日本") def Afica(): print("欢迎非洲") henan("3p") Japan("4p")
当有些函数只要一个参数,有些参数需要多个参数时,inner中的参数为(*args,**kwargs)
3.当两个参数的时候
user_status = False # 用户登录了就把这个改成True def login(auth_type): def auth(func): def inner(*args,**kwargs): _username = "alex" # 假装这是DB里存的用户信息 _password = "abc!23" # 假装这是DB里存的用户信息 global user_status if user_status == False: username = input("user:") password = input("pasword:") if username == _username and password == _password: print("welcome login....") user_status = True else: print("wrong username or password!") if user_status: print("用户已登录,验证通过...",func) func(*args,**kwargs) return inner return auth def home(): print("---首页----") def america(): print("----欧美专区----") def japan(): print("----日韩专区----") @login('qq')#henan = login('qq')(henan) def henan(video_type): print("----河南专区----",video_type) henan('3p')
再多加一层函数即可实现。