python_装饰器
def func(arg): def inner(): print('before') v = arg() print('after') return v return inner # 第一步:执行func函数并将下面的函数参数传递,相当于:func(index) # 第二步:将func的返回值重新赋值给下面的函数名。index = func(index) @func def index(): print('123') return '666' print(index())
目的:在不改变原函数的基础上,再函数执行前后自定义功能。
编写装饰器:
# 装饰器的编写 def x(func): def y(): ret =func() return ret return y # 装饰器的应用 @x def index(): pass # 装饰器的应用 @x def manage(): pass # 执行函数,自动触发装饰器 v = index() print(v)
应用场景:想要为函数扩展功能时,可以选择用装饰器。
装饰器编写格式:
def 外层函数(参数) def 内层函数(*args,**kwargs): return 参数(*args,**kwargs) return 内层函数
装饰器应用的格式:
@外层函数 def index(): pass index()
为什么要加*args和**kwargs?
接收原函数传递的值。
带参数的装饰器!
# 第一步:执行v1 = uuu(9) # 第二步:ret = v1(index) # 第三步:index = ret @uuu(9) def index(): pass
实例:装饰器执行N次
# 带参数的装饰器 def x(counter): def wrapper(func): def inner(*args,**kwargs): print('调用函数之前') v = [] # 函数执行N次 for i in range(counter): data = func(*args,**kwargs) # 执行原函数并获取返回值 v.append(data) print('调用函数之后') return v return inner return wrapper # 第一步:执行v1 = uuu(9) # 第二步:ret = v1(index) # 第三步:index = ret @x(9) def index(): return 1 result = index() print(result)