import time
deftimer(func):#timer(test1) func=test1defdeco(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs)#run test1
stop_time = time.time()print("running time is %s"%(stop_time-start_time))return deco
@timer # test1=timer(test1)deftest1():
time.sleep(3)print("in the test1")
test1()
1.4.2 三级装饰器
#! /usr/bin/env python# -*- coding: utf-8 -*-import time
defauth(auth_type):print("auth func:",auth_type)defouter_wrapper(func):defwrapper(*args,**kwargs):print("wrapper func args:",*args,**kwargs)print('运行前')
func(*args,**kwargs)print('运行后')return wrapper
return outer_wrapper
@auth(auth_type="local")# home = wrapper()defhome():print("welcome to home page")return"from home"
home()
1.5 装饰器在项目中应用场景
身份验证
写入日志
redis缓存
1.5.1 身份验证
user,passwd ='aaa','123'defauth(func):defwrapper(username,password,*args,**kwargs):if user == username and password == passwd:print("User has passed authentication")
res = func(username,password,*args,**kwargs)#这里执行func()相当于执行调用的函数如home()return res #为了获得home()函数返回值,可以将执行结果赋值给res然后返回print(home())结果是"from home"而不是"None"了else:raise ValueError("非合法用户")return wrapper
@auth
defhome(username,password):print("welcome to home page")return"from home"
home('aaa','123')
1.5.2 记录日志
#! /usr/bin/env python# -*- coding: utf-8 -*-from functools import wraps
import traceback
defdecoratore(func):
@wraps(func)deflog(*args,**kwargs):try:print("当前运行方法",func.__name__)return func(*args,**kwargs)except Exception as e:print(traceback.format_exc())# 这里应该调用log模块来记录到日志里return log
@decoratore
deftest():int('a')passif __name__ =='__main__':
test()''' 上面运行结果
当前运行方法 test
Traceback (most recent call last):
File "C:/Users/tom/Desktop/alipay_demo/aaa/t2.py", line 11, in log
return func(*args,**kwargs)
File "C:/Users/tom/Desktop/alipay_demo/aaa/t2.py", line 18, in test
int('a')
ValueError: invalid literal for int() with base 10: 'a'
22222
'''
# coding:utf-8from django.core.cache import cache
import time
# 获取readed缓存defget_readed_cache():# 判断键是否存在
key ='readed'if cache.has_key(key):
data = cache.get(key)else:# 不存在,则通过sql语句获取数据,并写入缓存,这里只是一个举例的sql语句
data ="select name from tb"# 写入缓存
cache.set(key, data,3600-int(time.time()%3600))return data
deftest1():
data = get_readed_cache()return data
deftest2():
data = get_readed_cache()return data
if __name__ =='__main__':
test1()
test2()
import time
t1 = time.time()
g =(i for i inrange(100000000))
t2 = time.time()
lst =[i for i inrange(100000000)]
t3 = time.time()print('生成器时间:',t2 - t1)# 生成器时间: 0.0print('列表时间:',t3 - t2)# 列表时间: 5.821957349777222