1.比如之前所写的管理员登陆系统,可以加上与用户之间的判定,这时候就可以用装饰器来完成
"""
['root','admin','redhat']
在实际的应用场景中,会采用多个装饰器先验证是否登陆成功,再验证权限是否足够
"""
import functools
import inspect
def is_admin(fun):
@functools.wraps(fun)
def zjs(*args,**kwargs):
#inspect.getcallargs返回一个字典,key值:形参 value值:对应的实参
insp_res = inspect.getcallargs(fun,*args,**kwargs)
print('inspect的返回值是:%s' %(insp_res))
if insp_res.get('name')=='root':
res = fun(*args,**kwargs)
return res
else:
print('not root cannot to operate')
return zjs
user_li=['admin','root','sjz']
def is_user(fun):
@functools.wraps(fun)
def ing(*args,**kwargs):
if args[0] in user_li:
res1 = fun(*args,**kwargs)
return res1
else:
print('no, u cannot login')
return ing
@is_user
@is_admin
def add(name):
print('添加信息')
add('root')
add('sjz')
add('jay')
2.判断整形装饰器
"""
编写装饰器required_ints, 条件如下:
# 1). 确保函数接收到的每一个参数都是整数;
# 2). 如果参数不是整形数, 打印 TypeError:参数必须为整形
"""
import functools
def required_ints(fun):
@functools.wraps(fun)
def zjs(*args, **kwargs):
for i in args:
if not isinstance(i, int):
print('TypeError:参数必须为整形')
return
res = fun(*args, **kwargs)
return res
return zjs
@required_ints
def add(a, b):
print(a + b)
add(1,4)
add(1, 4.0)
外加参数装饰器
前面写的add_log装饰器打印函数日志信息,如果我们想要再添加信息的话,就可以用到外加参数装饰器
import functools
import time
def log(qqq):
def add_log(fun):
@functools.wraps(fun)
def zjs(*args, **kwargs):
start_time = time.time()
res = fun(*args, **kwargs)
end_time = time.time()
print('<%s> [%s] 函数名:%s,运行时间:%.6f,运行返回值:%d'
% (qqq, time.ctime(), fun.__name__, end_time - start_time, res))
return res
return zjs
return add_log
@log('debug')
def log(x, y):
# time.sleep(1)
return x * y
print(log(2, 5))
如图:它所打印出的日志信息多了这一项,为我们的外加参数
外加参数练习
"""
# 编写装饰器required_types, 条件如下:
# 1). 当装饰器为@required_types(int,float)确保函数接收到的每一个参数都是int或者float类型;
# 2). 当装饰器为@required_types(list)确保函数接收到的每一个参数都是list类型;
# 3). 当装饰器为@required_types(str,int)确保函数接收到的每一个参数都是str或者int类型;
# 4). 如果参数不满足条件, 打印 TypeError:参数必须为xxxx类型
"""
import functools
def required_types(*types):
def required(fun):
@functools.wraps(fun)
def zjs(*args, **kwargs):
for i in args:
if not isinstance(i, types):
print('函数所有参数并非', types)
break
else:
res = fun(*args, **kwargs)
return res
return zjs
return required
@required_types(int, float)
def add(*args):
print(args)
add(1, 2, 3, 4, 5)
add('1','sjz')