1)装饰器的理解:
一、做用:在不改变原函数的基础上,给函数增长功能app
二、返回值:把一个函数看成参数,返回一个替代版的函数dom
三、本质:返回函数的函数函数
四、应用场景:计时器、记录日志、用户登录认证、函数参数认证
ui
2)无参函数装饰器spa
实例: 被装饰的函数没有参数
rest
执行结果为:日志
3)有参函数装饰器code
实例:当年龄小于0时,均输出0ci
4)装饰器练习
文档
一、定时器(获取每一个函数的执行时间)
import time
import string
import random
import functools
# 随机生成24个大小写英文字母
li = [random.choice(string.ascii_letters) for i in range(24)]
def getTime(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
start_time = time.time()
rest = fun(*args,**kwargs)
end_time = time.time()
print "函数运行时间为:%.6f" %(end_time-start_time)
return rest
return wrapper
@getTime
def con_add(): # 使用+来链接
sum = " "
for i in li:
sum += (i+',')
print sum
return 0
@getTime
def join_add(): # 使用内置函数join来链接
print ','.join(li)
return 1
print con_add() # 进行调用
print join_add()
显示结果以下:因而可知,使用内置函数运行时间小于普通函数。
注意:1、当被装饰函数有返回值的时候:咱们须要在装饰函数里面,对被装饰函数调用进行接收;而后返回接收值就能够显示被装饰函数的返回值了!
2、如何保留被装饰函数的函数名和帮助文档信息:导入functools包,并进行调用便可
二、记录日志:打印的日志格式为:【字符串时间】 函数名: xx 运行时间:xx 运行返回值:xx显示运行结果:import time
import functools
def add_log(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
start_time = time.time()
ret = fun(*args,**kwargs)
end_time = time.time()
print '[%s] 函数名:%s 运行时间:%.6s 运行的返回值的结果:%d' \
%(time.ctime(),fun.__name__,end_time-start_time,ret)
return wrapper
@add_log
def Log(x,y):
time.sleep(1)
return x+y
Log(1,2.2)
![]()
三、验证用户的登录认证(登录成功执行被装饰函数;失败继续执行登录)
import functools
login_user = ['admin', 'root']
def is_login(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs): # 能够使用第一个元组值来判断
if kwargs.get('name') in login_user:
res = fun(*args, **kwargs)
return res
else:
res = login()
return res
return wrapper
@is_login
def writeBlog(name):
return "写博客..."
注释:一个函数,能够有多个装饰器来修饰def login():
return "登录..."
print writeBlog(name = 'admin') # 此用户能够登录;执行结果为'写博客...'
四、函数参数认证:
1)、当装饰器为@required_type(int,float):确保函数接受到的每个参数为int或float
2)、当装饰器参数为list,确保每个参数类型均为list类
3)、当参数为(str,int):确保函数接受到的每个参数为str或int
4)、类型若以上参数均不知足,打印TypeError:参数必须是xxx
import functools
def required_type(*type):
def required_all(fun):
@functools.wraps(fun)
def wrapper(*args, **kwargs):
for i in args:
if isinstance(i, type):
pass
else:
print 'typeError:函数全部的参数并不是', type
break
else:
res = fun(*args, **kwargs)
return res
return wrapper
return required_all
@required_type(list)
def add(a, b):
return a + b
print add([1,2],2)