码迷,mamicode.com
首页 > 编程语言 > 详细

02python 装饰器(python函数)

时间:2019-01-08 15:03:57      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:The   direct   arch   containe   selection   editor   z-index   space   com   

装饰器的形成过程


 
 
 
20
 
 
 
 
 
1
import time
2

3

4
def func():                      # 定义一个函数
5
    time.sleep(0.01)
6
    print(‘hello world!‘)
7

8

9
def timer(f):                    # 一个闭包函数,接收一个函数,也叫做装饰器函数
10
    def inner():
11
        start = time.time()
12
        f()                      # 被装饰函数
13
        end = time.time()
14
        print(end - start)
15
    return inner
16

17

18
func = timer(func)
19
func()
20

 
 
 
装饰器的定义:把接收函数作为参数,以及返回内部函数的函数称之为装饰器函数        

语法糖的概念


 
 
 
20
 
 
 
 
 
1
import time
2

3

4
def timer(f):                    # 一个闭包函数,接收一个函数,也叫做装饰器函数
5
    def inner():
6
        start = time.time()
7
        f()                      # 被装饰函数
8
        end = time.time()
9
        print(end - start)
10
    return inner
11

12

13
@timmer                          # 语法糖 @装饰器函数名
14
def func():                      # 被装饰函数   # 定义一个函数   # func = timer(func)
15
    time.sleep(0.01)
16
    print(‘hello world!‘)
17

18
    
19
# func = timer(func)
20
func()                           # 在调用的时候只要调用func()即可!这才是装饰器
 
 
 
再次进化        (被装饰的函数有返回值)

 
 
 
55
 
 
 
 
 
1
import time
2

3

4
def timer(f):
5
    def inner():
6
        start = time.time()
7
        f()
8
        end = time.time()
9
        print(end - start)
10
    return inner
11

12

13
@timer
14
def func():
15
    time.sleep(0.01)
16
    print(‘hello world!‘)
17
    return ‘pontoon on the way!
18

19
ret = func()
20
print(ret)
21

22
>>>hello world!
23
0.010217905044555664
24
None        # 打印的结果是None,而不是pontoon on the way!,因为这里接收的是inner函数里面的返回值,而inner函数里面并没有返回值
25

26

27
-------------------------------------------------------------------------------------------------------------------------------------------------------
28
import time
29

30

31
def timer(f):
32
    def inner():
33
        start = time.time()
34
        ret = f()                   # 得到传递过来函数的返回值
35
        end = time.time()
36
        print(end - start)
37
        return ret                  # 返回
38
    return inner
39

40

41
@timer
42
def func():
43
    time.sleep(0.01)
44
    print(‘hello world!‘)
45
    return ‘pontoon on the way!‘
46

47

48
# func = timer(func)
49
ret = func()
50
print(ret)
51

52
>>>hello world!
53
0.010081291198730469
54
pontoon on the way!
55

 
 
 
究极进化        (被装饰的函数有参数)


 
 
 
49
 
 
 
 
 
1
import time
2

3

4
def timer(f):
5
    def inner(*args, **kwargs):
6
        start = time.time()
7
        ret = f(*args, **kwargs)        # 得到传递过来函数的返回值
8
        end = time.time()
9
        print(end - start)
10
        return ret                      # 返回
11
    return inner
12

13

14
@timer
15
def func(a, b):
16
    time.sleep(0.01)
17
    print(‘hello world!‘)
18
    return ‘pontoon on the way!‘
19

20

21
# func = timer(func)
22
ret = func(1, 2)                        # 这里相当于执行inner()
23
print(ret)
24

25
-----------------------------------------------------------------------------------------------
26
# 简化之
27
import time
28

29

30
def wrapper(f):
31
    def inner(*args, **kwargs):
32
        ret = f(*args, **kwargs)        # 得到传递过来函数的返回值
33
        return ret                      # 返回
34
    return inner
35

36

37
@wrapper
38
def func(a, b):
39
    time.sleep(0.01)
40
    print(‘hello world!‘)
41
    return ‘pontoon on the way!‘
42

43

44
# func = timer(func(1, 2))
45
ret = func(1, 2)                        # 这里相当于执行inner()
46
print(ret)
47

48

49
至此简化版的装饰器OK了!
 
 
 
装饰器的作用                   
        在不修改原函数及其调用方式的情况下对原函数的功能进行拓展        
 
 
原则:开放闭合原则        
  开放:对拓展时开放的
  封装:对修改是封闭的
 
 
装饰器的固定模式            

 
 
 
x
 
 
 
 
 
1
def wrapper(f):
2
    def inner(*args, **kwargs):
3
        ret = f(*args, **kwargs)          # 被装饰的函数要有接收的参数并且有返回值!
4
        return ret
5
    return inner
6

7

8
@wrapper
9
def qqxing():
10
    print(123)
11

12

13
print(qqxing())
 
 
 

装饰器的进阶

    1、带参数的装饰器
 
    2、多个装饰器装饰同一个函数
 
 
 
 
 
 
 
 
 
 

02python 装饰器(python函数)

标签:The   direct   arch   containe   selection   editor   z-index   space   com   

原文地址:https://www.cnblogs.com/pontoon/p/10238331.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!