装饰器的功能:

当我们想增强某个函数的功能但是有不想修改原来的代码,或者说无法修改的时候,这时候就可使使用装饰器来增强或者完善函数的功能,通过在原有函数的功能上在动态的添加一些方法,就可以称之为一个装饰器。

装饰器分为3中类型,1,无参数无返回值,2,带参无返回值,3,带参有返回值

1,无参数,无返回值装饰器:

#装饰器函数
def good_fortune(func):
def wrapper():
print('小明准备去买彩票')
func()
print('惊喜的发现中了大奖!')
return wrapper
#被装饰后
@good_fortune
def buy():
print('小明去买了彩票')
#此时函数已经被装饰过
buy()

执行结果为:

>>小明准备去买彩票

>>小明去买了彩票

>>惊喜的发现中了大奖!

2,使用带参数装饰器:

首先写一个装饰器,也就是一个函数,该函数可以接受函数作为参数,并且返回一个闭包,而且可以在闭包内执行传递进来的函数,闭包可以在执行函数前添加一些判断,或者异常处理,保证传递进来的函数能正常运。

在需要装饰的函数前添加

@ 装饰器名

就可以使用了,如:

@decorator #当执行show函数是,就会先执行decorator装饰器里的代码,再使用原函数时,就已经是装饰过的了
def show(lt):
print('列表排序中')
lt.sort()
print(lt)
下面是完整的使用流程
#装饰器函数,此功能主要用防止因为数据类型错误,导致报错!
def decorator(func):
def inside(lt):
try:
func(lt)
print('排序结束')
except :
print('数据内部错误')
return inside
#@decorator
def show(lt):
print('列表排序中')
lt.sort()
print(lt)
lt = [3213,21.3,True,'+',3.21,'-',3.21,3.21,3.21,3.21,3213123,321,3,21,3,21,3,21,321]
#此时,show()已经是被装饰器装饰过的函数,并且加入了异常处理功能
show(lt)
#执行结果为:
>>列表排序中
>>[3, 3, 3, 3.21, 3.21, 3.21, 3.21, 3.21, 21, 21, 21, 21.3, 321, 321, 3213, 3213123]
>>排序结束

3,带参数有返回值的装饰器:

下面的简单的表示函数转世后,增加返回值,改变原来的结果!

def decorator(func):
def inside(*args, **kwargs):
return func(*args, **kwargs) + 10
return wrapper
@decorator
def pingfang(n):
return n * n
print(pingfang(4))