1.装饰器的作用
在 不修改被装饰对象的源代码;不修改被装饰对象的调用方式; 为被封装的对象添加新的功能。
例如下列:
test函数为事先封装好的一个功能,但是在后期迭代的过程中,希望能为该功能增加一个计算运行时间的功能。这时候,装饰器就起到了作用了。
def test(s):
print(‘%s is testing‘%s)
time.sleep(3)
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print(start - end)
return res
return wrapper
test= timer(test)
###新的函数test中含有打印运行时间的功能,单完全没有改变之前函数的源代码,以及调用方式
test(‘dd‘)
下面是装饰器的真正使用方法 : @wrapper
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print(start - end)
return res
return wrapper
@timer ##引用装饰器
def test(s):
print(‘%s is testing‘%s)
time.sleep(3)
test(‘tina‘)
无参装饰器
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
end = time.time()
print(start - end)
return res
return wrapper
@timer
def test(s):
print(‘%s is testing‘%s)
time.sleep(3)
test(‘tina‘)
有参装饰器
def data_from(file):
def data_form(func):
def wrapper(*args, **kwargs):
if file == ‘txt‘:
print(‘data from txt‘)
res = func(*args, **kwargs)
return res
if file == ‘sql‘:
print(‘data from sql‘)
if file == ‘mongodb‘:
print(‘data from mongodb‘)
return wrapper
return data_form
@data_from(‘sql‘)
def tell_name(name):
print(‘my name is %s‘ %name)
tell_name(‘tt‘)
原文:https://www.cnblogs.com/tina053/p/10331260.html