2层装饰器不加参数
def async(f):
def wrapper(*args, **kwargs):
thr = Thread(target=f, args=args, kwargs=kwargs)
thr.start()
return wrapper
@async
def a():
print("123")
装饰器就是将你要装饰的函数放到了你写的装饰器里面执行,如果不return的话,被装饰的函数的return就不会被返回
带参数的装饰器
def logging(level):
def wrapper(func):
def inner_wrapper(*args, **kwargs):
print ("[{level}]: enter function {func}()".format(
level=level,
func=func.__name__))
return func(*args, **kwargs)
return inner_wrapper
return wrapper
@logging(level='INFO')
def say(something):
print ("say {}!".format(something))
# 如果没有使用@语法,等同于
# say = logging(level='INFO')(say)
@logging(level='DEBUG')
def do(something):
print ("do {}...".format(something))
if __name__ == '__main__':
say('hello')
do("my work")
最外面的return是返回所有
没有最外面的return的时候
def modify(func):
def injob():
print("正在执行扩展功能")
return func()
# return injob()
@modify
def func1():
print("func 正在执行")
return 'result'
结果是
有return的结果
def modify(func):
def injob():
print("正在执行扩展功能")
return func()
return injob()
@modify
def func1():
print("func 正在执行")
return 'result'
案例
添加时间装饰器,控制采集频率
def desc_time(s):
def wapper(func):
name = func.__name__ # 给变量name赋值 确定访问的函数
func_identify = {name: 0, 'second': s}
def inner(*args, **kwargs):
use_time = func_identify[name] + func_identify['second'] # 需等待这些时间之后才可以再次访问
now_time = time.time()
re_time = use_time - now_time # 这个结果是一个负数
if now_time > use_time: # 如果当前时间大于等待的时间
res = func(*args, **kwargs)
func_identify[name] = now_time # 给 func_identify[name] 重新赋值
else:
print("请在{}之后访问".format(re_time))
time.sleep(re_time)
res = func(*args, **kwargs)
return res
return inner
return wapper
@desc_time(random.randint(2,5))
def getData(self,url):
s = requests.Session()
data = s.get(url)
return data