python装饰器总结

写一个记录函数运行时间的装饰器

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

from functools import wraps
import time


# 使用直接装饰器 @listener(Monitor)
class Monitor(object):
@staticmethod
def start_monitor():
return time.clock()

@staticmethod
def end_monitor():
return time.clock()


def listener(listen):
def log(func):
@wraps(func)
def wrapper(*args, **kw):
startime = listen.start_monitor()
f = func(*args, **kw)
endtime = listen.end_monitor()
print("total time is {0}".format(startime-endtime))
return f
return wrapper
return log

一个函数 挂多个装饰器的执行顺序

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
44
45
46
47

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

import functools


# 采用functools.wraps的目的是为了使装饰器返回的类型始终是func的类型,否则将返回嵌套高阶函数的中的类型,例如返回的是wraper
# 采用参数*args ,**kw是解决函数多参数的问题
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper


# 修饰器参数的情况
def logger(pram):
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s(): and parsms is %s' %(func.__name__,pram))
return func(*args, **kw)
return wrapper
return log


@log
def showMesage(name,age):
print("my name is {0} and my age is {1}".format(name,age))


@logger("hello")
def getMessage(name,age):
print("my name is {0} and my age is {1}".format(name,age))

# 添加多个修饰器来拓展所需的功能
@log
@logger("hello15466")
def recieveMessage(name,age):
print("my name is {0} and my age is {1}".format(name,age))


if __name__=='__main__':
# showMesage("ddd",21)
# getMessage("aaa",43)
recieveMessage("ccc",34)

类装饰器

带参数的装饰器