Hu3sky's blog

python装饰器

Word count: 608 / Reading time: 3 min
2018/09/01 Share

python装饰器

不带参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import time
def deco(func):
def wrapper():
startTime=time.time()
func()
endTime=time.time()
msecs=(endTime - startTime)*1000
print("time is %s" %msecs)
return wrapper

@deco
def func():
print("hello")
time.sleep(1)
print("world")

if __name__ == '__main__':
f = func
f()

这里的deco函数就是最原始的装饰器,它的参数是一个函数,然后返回值也是一个函数。其中作为参数的这个函数func()就在返回函数wrapper()的内部执行。然后在函数func()前面加上@deco,func()函数就相当于被注入了计时功能,现在只要调用func(),它就已经变身为“新的功能更多”的函数了。

带参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import time

def deco(func):
def wrapper(a,b):
func(a,b)
print("a*b=%d" %(a*b))
return wrapper

@deco
def func(a,b):
print("hello h4ck")
time.sleep(1)
print("a+b=%d" %(a+b))

if __name__ == '__main__':
f = func
f(5,6)

参数不定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import time

def deco(func):
def wrapper(*args,**kwargs):
func(*args,**kwargs)
print("haha yi gei wo li giaogiao!")
return wrapper

@deco
def func(a,b):
print("hello h4ck")
time.sleep(1)
print("a+b=%d" %(a+b))

@deco
def func2(a,b,c,d):
print("hello fun2")
time.sleep(1)
print("a+b+c+d=%d" %(a+b+c+d))


if __name__ == '__main__':
func(5,6)
func2(1,2,3,400)

多个装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import time

def deco(func):
print("a")
def wrapper(*args,**kwargs):
print("hello hu3sky")
func(*args,**kwargs)
return wrapper

def deco2(func):
print("b")
def wrapper(*args,**kwargs):
print("are you hu3sky2?")
func(*args,**kwargs)
return wrapper

def deco3(func):
print("c")
def wrapper(*args,**kwargs):
print("you are hu3sky3")
func(*args,**kwargs)
return wrapper

@deco2
@deco3
@deco
def func(a,b):
print("hello h4ck")
time.sleep(1)
print("a+b=%d" %(a+b))

@deco2
@deco
@deco3
def func2(a,b,c,d):
print("hello fun2")
time.sleep(1)
print("a+b+c+d=%d" %(a+b+c+d))


if __name__ == '__main__':
func(5,6)
func2(1,2,3,400)

结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
C:\Users\asus\Desktop (master -> origin)
λ test.py
a
c
b
c
a
b
are you hu3sky2?
you are hu3sky3
hello hu3sky
hello h4ck
a+b=11
are you hu3sky2?
hello hu3sky
you are hu3sky3
hello fun2
a+b+c+d=406

装饰器的执行顺序

总结一下就是,装饰顺序按靠近函数顺序执行,调用时由外而内,执行顺序和装饰顺序相反

CATALOG
  1. 1. python装饰器
  2. 2. 不带参数
  3. 3. 带参数
  4. 4. 参数不定
  5. 5. 多个装饰器
  6. 6. 装饰器的执行顺序