1、什么式装饰器

  装饰器本质就是函数,为其他函数添加附加功能

  需要把握的原则:

  1、不修改被修饰函数的源代码

  2、不修改被装饰函数的调用方式

  装饰器的知识储备:

  装饰器=高阶函数+函数嵌套+闭包

  高阶函数的应用举例

 1 # -*- coding:utf-8 -*-
 2 import time
 3 def foo():
 4     time.sleep(1)
 5     print("from-foo:您好")
 6 def timmer(func):
 7     start_time=time.time()
 8     func()
 9     stop_time = time.time()
10     print("from-time:运行时间%s"%(stop_time-start_time))
11     return func
12 
13 foo=timmer(foo)
14 foo()

  函数的嵌套举例

  函数里面在定义函数才是嵌套

 1 def father(name):
 2     print("from father %s" % name)
 3 
 4     def son():
 5         print("from son %s" % name)
 6 
 7         def grandson():
 8             name = "zf1"
 9             print("grandfather %s" % name)
10 
11     print(locals())
12 
13 
14 father("zf")

   装饰器的构架

 1 # -*- coding:utf-8 -*-
 2 
 3 import time
 4 
 5 
 6 def timmer(func):
 7     def wrapper():
 8         start_time = time.time()
 9         func()
10         stop_time = time.time()
11         print("函数运行时间为%.4f" % (stop_time - start_time))
12 
13     return wrapper
14 
15 
16 def test():
17     print("函数正在运算中")
18     time.sleep(3)
19     print("函数运算完毕")
20 
21 
22 test = timmer(test)   #   @timmer
23 test()

在@timmer====程序中第22行

 若test函数有返回值

 1 # -*- coding:utf-8 -*-
 2 
 3 import time
 4 
 5 
 6 def timmer(func):
 7     def wrapper():
 8         start_time = time.time()
 9         res = func()
10         stop_time = time.time()
11         print("函数运行时间为%.4f" % (stop_time - start_time))
12         return res
13 
14     return wrapper
15 
16 
17 @timmer
18 def test():
19     print("函数正在运算中")
20     time.sleep(3)
21     print("函数运算完毕")
22     return "这是test的返回值"
23 
24 
25 res = test()
26 print(res)

若test函数有参数

# -*- coding:utf-8 -*-

import time


def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res = func(*args,**kwargs)
        stop_time = time.time()
        print("函数运行时间为%.4f" % (stop_time - start_time))
        return res

    return wrapper


@timmer
def test(name,age):
    print("函数正在运算中")
    time.sleep(1)
    print("函数运算完毕名字%s,年龄%s"%(name,age))
    return "这是test的返回值"


res = test("zf",18)
print(res)

 

闭包函数加上认证功能举例

 1 # -*- coding:utf-8 -*-
 2 
 3 def test(func):
 4     def wrapper():
 5         name=input("name>>>")
 6         password=input("password>>>")
 7         if name=="zf" and password=="123456":
 8             func()
 9         else:
10             print("登陆失败")
11     return wrapper
12 
13 
14 def home():
15     print("登陆的自己的主页")
16 
17 @test
18 def shopping_car():
19     print("登陆到自己的购物车")
20 
21 # home()
22 shopping_car()

闭包函数模拟session

 1 # -*- coding:utf-8 -*-
 2 user_list=[{"username":"zf","passwd":"123456"},{"username":"zf1","passwd":"1234561"}]
 3 
 4 
 5 user_stat={"username":None,"login":False}
 6 
 7 
 8 
 9 def test(func):
10     def wrapper():
11         # global passkey
12         if user_stat["username"]==None and user_stat["login"]==False:
13             name = input("name>>>").strip()
14             password = input("password>>>").strip()
15             for user_dict in user_list:
16                 if name == user_dict["username"] and password == user_dict["passwd"]:
17                     user_stat["username"]=user_dict["username"]
18                     user_stat["login"]=True
19                     return func()
20                     # break
21             else:
22                 print("登陆失败")
23         else:
24             return func()
25 
26     return wrapper
27 
28 
29 @test
30 def home():
31     print("登陆的自己的主页")
32 
33 
34 @test
35 def shopping_car():
36     print("登陆到自己的购物车")
37     return "购物成功"
38 
39 
40 home()
41 res=shopping_car()
42 print(res)

 闭包函数带参数的装饰器

 1 # -*- coding:utf-8 -*-
 2 user_list=[{"username":"zf","passwd":"123456"},{"username":"zf1","passwd":"1234561"}]
 3 
 4 
 5 user_stat={"username":None,"login":False}
 6 
 7 
 8 def test1(test_ytpe="file"):
 9     def test(func):
10         def wrapper():
11             print(test_ytpe)
12             # global passkey
13             if user_stat["username"]==None and user_stat["login"]==False:
14                 name = input("name>>>").strip()
15                 password = input("password>>>").strip()
16                 for user_dict in user_list:
17                     if name == user_dict["username"] and password == user_dict["passwd"]:
18                         user_stat["username"]=user_dict["username"]
19                         user_stat["login"]=True
20                         return func()
21                         # break
22                 else:
23                     print("登陆失败")
24             else:
25                 return func()
26 
27         return wrapper
28     return test
29 
30 
31 @test1()  #test=test1()   -->   @test  home=test(home)
32 def home():
33     print("登陆的自己的主页")
34 
35 
36 @test1()
37 def shopping_car():
38     print("登陆到自己的购物车")
39     return "购物成功"
40 
41 
42 home()
43 res=shopping_car()
44 print(res)