装饰器
在不修改函数的情况下给函数添加新的功能
2. ##### 什么是装饰器
装饰器的本质就是一个函数(这个函数是一个实参高阶函数,也是返回值高阶函数)
无参装饰器
def 函数名1(函数名2):
def 函数名3(*args,**kwarge)
新功能代码
返回值 = 函数名2(*args,**kwargs)
return 返回值
return 函数名3
说明:
函数名1 - 装饰器名字,命名的时候和这个装饰器要添加的功能相关联
函数名2 - 随便命名,指向被添加功能的函数;可以命名成fn
函数名3 - 随便命名,在原函数上添加完新功能后产生的函数
新功能代码 - 实现新加功能的代码
写一个装饰器,在函数开始执行前打印开始之前打印’函数开始’
def ff_add(add):
def ff_add1(*args,**kwargs):
print('函数开始')
result = add(*args,**kwargs)
return result
return ff_add1
@ff_add
def ff_sum(num1,num2):
print(num1 + num2)
ff_sum(100,200)
@ff_add
def factorial(n):
sum1 = 1
for i in range(1,n+1):
sum1 *= i
return sum1
print(factorial(10))
补充:定义函数的时候:*args,**kwargs同时存在的意义 - 不定长参数在调用的时候既可以使用位置参数,也可以使用关键字参数
练习1:写一个装饰器,将所有返回值是字符串的函数中所有小写字母,换成大写字母
def ff_upper(fn):
def upper1(*args,**kwargs):
result = fn(*args,**kwargs)
# a = ''
if type(result) == str:
return result.upper()
# for i in result():
# if 'a' <= i <= 'z':
# b = chr(ord(i) - 32)
# a += result
# else:
# a += i
# return a
else:
return result
return upper1
@ff_upper
def str1():
return 'abc'
print(str1())
相当于:定义一个函数
def str_func():
return 'abc'
str_func = ff_upper(str_func)