装饰器2
嵌套函数:
在一个函数里面在定义一个函数(有局部变量的特性,不能在外部调用)
针对装饰器的三个原则:
1.函数即“变量”
2.高阶函数
3.嵌套函数
举下面一个例子
它的运行过程呢可以将装饰器阐述清楚:(每一行后都有标记#后的数字表示编号)
a.定义auth这个函数,然后向下找定义的index()函数,发现没有参数传进去,再接着向下找,@auth(auth_type="local")函数,它将local参数传进去。
b.接着打印传进去的参数类型#3,然后接着定义嵌套函数#4
,直接返回结果,此时将调用他的函数传了进来,比如传了home进来。再进入到嵌套函数wrapper里面,返回函数名,并且加了括号,相当于home()调用
c.接着就向下走,因为home()函数是local类型,所以会让输入账户和密码
d.“ldap”类型也是同理
user,passwd='alex','abc123'#1
def auth(auth_type):#2
print("auth ",auth_type)#3
def outer_wrapper(func):#4
def wrapper(*args,**kwargs):#5
print("wrapper args",*args,**kwargs)#6
if auth_type=="local":#7
username=input("username:").strip()#8
password=input("passsword:").strip()#9
if user==username and passwd==password:#
print("\033[31;1myou have logged# in\033[0m")
return func(*args,**kwargs)#12
else:
exit("\033[32;1minvalied logged\033[0m")#13
elif auth_type=="ldap":#14
print("不会")#15
return wrapper#16
return outer_wrapper#17
def index():
print('welcome to index ')
@auth(auth_type="local")
def home():
print('welcome to home')
return "from home"
@auth(auth_type="ldap")
def bbs():
print('welcome to bbs')
index()
home()
bbs()
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步