python中有参数的装饰器

在装饰器的使用过程中我们可以实现对装饰器传递参数的功能,以下面的例子来看带参的装饰器如何使用~~~~:

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)
运行结果:
(, )
(1, 1)
1
1
1,1的和为:2

你可能感兴趣的:(python)