装饰器的理解

封闭:已实现的功能代码不应该被修改

开放:对现有的功能扩展开放

装饰器的简单示例

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
复制代码