装饰器的概念
装饰器本质是一个函数,是为了使其他函数在不修改代码的情况下,可以实现额外的功能。
实现步骤
编写一个普通的函数
def add(a, b):
print(a + b)
除了可以实现加法运算功能外,他还可以将两个字符串、元组、列表来进行拼接合并,但是,如果两个参数不是同一个类型,他就会报错。
def add(a, b):
print(a + b)
add(1, 'q')
比如,在传入参数为一个数字和字符串时,报错为:TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
增加判定条件
为了使程序容错率更高,让他在遇到两个参数类型不一样的,可以有正确的应对措施,需要给他加上一些判定条件。
def add(a, b):
if type(a) == type(b):
print(a + b)
else:
print('参数类型不一致')
封装判定条件
上述的代码虽然达到了验证传入参数类型的目的,但是改变了原有的代码。因此需要将判定条件封装在另一个函数中。
def check(a, b):
if type(a) == type(b):
add(a, b)
else:
print('参数类型不一致')
def add(a, b):
print(a + b)
对判定条件的函数进行柯里化
上述封装后,虽然可以达到判定的目的,但是还是无法通过装饰器的使用方法来达到调用的判定条件的目的。因此需要将判定条件的函数柯里化:
def check(fun):
def check_type(a, b):
if type(a) == type(b):
fun(a, b)
else:
print('参数类型不一致')
return
return check_type
@check
def add(a, b):
print(a + b)
通过@加判定条件的函数名字就可以使用自己实现的这个装饰器