封闭:已实现的功能代码不应该被修改
开放:对现有的功能扩展开放
1 def outer(func): 2 def inner(): #func=f1,装饰函数的形参是被装饰函数(f1)的对象 3 func() 4 return inner #inner既是内层inner()函数的对象,也是f1函数的对象 5 6 @outer 7 def f1(): 8 print("ok")
以上装饰器示例的执行顺序:
1)自动执行outer函数并且将其下面的函数名fun当作参数来传递;
2)将outer函数的返回值(变量或者是函数),重新赋值给fun;
3)一旦结合装饰器后,调用f1其实执行的是inner函数内部,原来的fun被覆盖;
4)一旦这个函数被装饰器装饰后,被装饰的函数重新赋值成装饰器的内层函数
依据如上,我们可以总结出,它的执行顺序具体为:
先执行outer的函数
再执行内部函数inner
下来执行到inner函数的返回值
再具体到inner的函数,执行inner函数里边的表达式。
1 dict1={"isLogin":True} 2 def outer(func): #func=admin,装饰函数的形参是被装饰函数(admin)的对象 3 def inner(): 4 if dict1["isLogin"]==True: 5 func() 6 else: 7 print("请登录") 8 return inner #inner既是内层inner()函数的对象,也是admin()函数的对象 9 def login(username="cch",password="cch123"): 10 if username=="cch" and password=="cch123": 11 dict1["isLogin"]=True 12 return "login successful" 13 else: 14 print("账号或者密码错误") 15 @outer 16 def admin(): 17 print("欢迎登录后台管理系统") 18 while True: 19 p=int(input("1、登录 2、后台管理系统\n")) 20 if p==1: 21 login() 22 elif p==2: 23 admin() 24 else: 25 break
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律