函数的装饰器
把一个函数当作参数,返回一个替代版的函数
本质上就是一个返回函数的函数
输入
def funA(fn):
print('a')
fn() # 执行传入的FN参数
return 'A'
## b函数被a函数修饰,所以a函数的返回值就是b函数的参数
@funA
def funB():
print('qwertyu')
print(funB)
输出
a
qwertyu
A
装饰有参数的函数
输入
import time
def decorator(func):
def wrapper(*args,**kwargs):
print(time.time())
func(*args,**kwargs)
return wrapper
@decorator
def f3(func_name1,func_name2,**kwargs):
print('This is function ' + func_name1)
print('This is function ' + func_name2)
print(kwargs)
f3('test1','test2',a=1,b=2,c='westos')
输出
1568185059.3025641
This is function test1
This is function test2
{'a': 1, 'b': 2, 'c': 'westos'}
多个装饰器修饰一个函数
输入
import functools
import inspect
def is_admin(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
#inspect.getcallargs返回一个字典,key值:形参 value值:对应的实参
inspect_res = inspect.getcallargs(fun,*args,*kwargs)
print('inspect的返回值: %s' %inspect_res)
if inspect_res.get('name') == 'root':
res = fun(*args,**kwargs)
return res
else:
print('Permission denied!')
return wrapper
login_user = ['root','admin','redhat']
def is_login(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
if args[0] in login_user:
res = fun(*args,**kwargs)
return res
else:
print('Error: %s未登录' %args[0])
return wrapper
@is_login
@is_admin
def add_student(name):
print('添加学生%s...' %name)
add_student('root')
输出
inspect的返回值: {'name': 'root'}
添加学生root...
带参数的装饰器
需求如下:
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(*kinds):
def required(fun):
@functools.wraps(fun)
def wrapper(*args,**kwargs):
for i in args:
if not isinstance(i,kinds):
# print('TypeError:参数必须为',kinds)
raise TypeError('参数必须为%s,%s' %kinds)
else:
res = fun(*args,**kwargs)
return res
return wrapper
return required
@required_types(float,float)
def add(a,b):
return a+b
print(add(1.0,2.1))
输出
3.1
9925



被折叠的 条评论
为什么被折叠?



