一、装饰器
装饰器:外部函数传入被装饰函数名,内部函数返回装饰函数名。
装饰器功能:引入日志、函数执行时间统计、执行函数前预备处理、执行函数后清理功能、权限校验等场景、缓存
1 | # 装饰器:外部函数传入被装饰函数名,内部函数返回装饰函数名。 |
被装饰的函数无参数:1
2
3
4
5
6
7
8
9
10
11
12
13
14# 无参数的函数
from time import ctime,sleep
def timefun(func):
def wrappedfunc():
print('%s called at %s' %(func.__name__,ctime()))
func()
return wrappedfunc
def foo():
print('I am foo')
foo()
被装饰的函数有参数:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 被装饰的函数有参数
from time import ctime,sleep
def timefun(func):
def wrappedfunc(a,b):
print('%s called at %s'%(func.__name__,ctime()))
print(a,b)
func(a,b)
return wrappedfunc
def foo(a,b):
print(a+b)
foo(3,5)
被装饰的函数有不定长参数:1
2
3
4
5
6
7
8
9
10
11
12
13
14# 被装饰的函数有不定长参数
from time import ctime, sleep
def timefun(func):
def wrappedfunc(*args,**kwargs):
print('%s called at %s'%(func.__name__,ctime()))
func(*args,**kwargs)
return wrappedfunc
def foo(a,b,c):
print(a+b+c)
foo(3,5,7)
装饰器中的return:1
2
3
4
5
6
7
8
9
10
11
12
13
14# 装饰器中的return
from time import ctime, sleep
def timefun(func):
def wrappedfunc():
print("%s called at %s"%(func.__name__, ctime()))
return func()
return wrappedfunc
def getInfo():
return '----haha----'
print(getInfo())
装饰器带参数,在原有装饰器的基础上,设置外部变量:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 装饰器带参数,在原有装饰器的基础上,设置外部变量
from time import ctime, sleep
def timefun_arg(pre='hello'):
def timefun(func):
def wrappedfunc():
print('%s called at %s %s'%(func.__name__,ctime(),pre))
return func()
return wrappedfunc
return timefun
def foo():
print('I am foo')
foo() #可以理解为foo()==timefun_arg("python")(foo)()
类装饰器(扩展,非重点):
装饰器函数其实是这样一个接口约束,它必须接受一个callable对象作为参数,然后返回一个callable对象。在Python中一般callable对象都是函数,但也有例外。只要某个对象重写了 __call__() 方法,那么这个对象就是callable的。
1 | class Test(): # 用Test来装作装饰器对test函数进行装饰的时候,首先会创建Test的实例对象 |
持续更新…
最后更新: 2018年12月04日 16:03