装饰器的作用,在不改变函数的情况下,在函数前后添加功能。
文件1:zsq1.py
#!/usr/bin/env python3 def outer(func): def inner(*args,**kwargs): print("before") r=func(*args,**kwargs) print("after") return r return inner #返回 @outer def f1(arg): print(arg) return "原始f1的返回值" @outer def f2(arg1,arg2): print(arg1,arg2) """ @+函数名 功能: 1.自动执行outer函数,并且将下面的函数名f1当作参数传递,相当于把原始f1赋值给func 2.将outer函数的返回值,内层inner函数,重新赋值给f1,相当于把f1变成inner去执行 """ ret=f1("ss") print("返回值",ret) ret=f2("aa","bb") print("返回值",ret)
文件2:zsq2.py
import zsq1 ret=zsq1.f1("ss") print("返回值",ret) ret=zsq1.f2("11","22") print("返回值",ret)
装饰器做权限认证
LOGIN_USER = {"is_login":False} def outer(func): def inner(*args,**kwargs): if LOGIN_USER["is_login"]: r=func() return r else: print("请登录") return inner @outer def manager(): print("后台管理") print("欢迎%s登陆" % LOGIN_USER["current_user"]) def login(username,pwd): if username=="ss" and pwd =="123": LOGIN_USER["is_login"]=True LOGIN_USER["current_user"]=username manager() def main(): inp=input("1.后台管理;2.登陆") if inp=="1": manager() elif inp=="2": username=input("用户名") passwd=input("密码") login(username,passwd) main()
多层装饰器
USER_INFO={} def check_login(func): def inner(*args,**kwargs): if USER_INFO.get("is_login",None): ret=func(*args,**kwargs) return ret else: print("请登录") login() return inner def check_admin(func): def inner(*args,**kwargs): if USER_INFO.get("user_type",None) ==1: ret=func(*args,**kwargs) return ret else: print("无权限") return inner @check_login @check_admin def index(): #管理员功能 print("index") @check_login def home(): #普通用户 print("home") def login(): username=input("用户名") pwd=input("密码") if username=="admin" and pwd=="123": USER_INFO["is_login"] = True USER_INFO["user_type"] =1 if username=="ss" and pwd=="123": USER_INFO["is_login"] =True USER_INFO["user_type"] =2 else: print(错误) def main(): inp=input("1.登陆;2.查看信息;3.超级管理员") if inp=="1": login() elif inp=="2": home() elif inp=="3": index() main()