在装饰器的使用过程中我们可以实现对装饰器传递参数的功能,以下面的例子来看带参的装饰器如何使用~~~~:
1.无参数的装饰器(低配)
需求: 1. 编写装饰器required_ints, 条件如下:
1). 确保函数接收到的每一个参数都是整数;
2). 如果参数不是整形数, 打印 :参数必须为整形
import functools
def require_int(f):
@functools.wraps(f)
def wrapper(*args,**kwargs):
print(args )
for i in args :
print(i)
if not isinstance(i,int):
print("TypeError!请输入整型参数~~~~")
return
else:
res=f(*args,**kwargs)
return res
return wrapper
@require_int
def fun(a,b):
print('%d,%d的和为:%d'%(a,b,a+b))
fun(1,1.2)
运行结果:
(1, 1.2)
1
1.2
TypeError!请输入整型参数~~~~
2.带参数的装饰器(升级)
需求:编写装饰器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 require_type(*kind):
def require_int(f):
@functools.wraps(f)
def wrapper(*args,**kwargs):
print(kind)
print(args )
for i in args :
print(i)
if not isinstance(i,kind):
print("TypeError!请输入类型参数~~~~",kind)
return
else:
res=f(*args,**kwargs)
return res
return wrapper
return require_int
@require_type(int,str)
def fun(a,b):
print('%d,%d的和为:%d'%(a,b,a+b))
fun(1,1)
运行结果:
(<class 'int'>, <class 'str'>)
(1, 1)
1
1
1,1的和为:2