核心:在不影响原来函数的调用方式和结果的前提下,扩展他的功能
装饰器是修改其他函数功能的函数,装饰器有助用让我们的代码更短。
当您需要扩展您不想修改的函数的功能时,这是很理想的
例如:
def decor(func):
def wrap(*args):
print('________')
func(*args)
print('________')
return wrap
def print_text(*args):
print('hello world')
decorated=decor(print_text)
decorated()
#结果 ————————————
hello world
____________
我们定义了一个名为decor 的函数,他有一个单一的参数func。
在decor 中我们定义了一个名为wrap的嵌套函数。
wrap函数将打印一个字符串,然后调用func(),并打印另一个字符串。
我们可以说,装饰变量是print_text的装饰版本-他是print_text上加一些东西。
这是通过重新赋值包含我们的函数变量来完成的。
print_text=decor(print_text)
print_text()
上面这段代码很重要,不容易理解
他这莫做的意义在于 调用print_text函数的时候,不是执行
def print_text():
print('hello world')
这个函数 ,而是执行
def decor(func):
def wrap():
print('________')
func()
print('________')
return wrap
并把print_text这个函数作为参数 传给decor这个函数进行执行
最终我们在执行print_text这个函数时,它本身的调用方式没有变化,执行结果 也没有发生变化,也加入我们想加入的功能。
继续演变:
python为了简化,定义了一种方法
def decor(func):
def wrap(*args):
print('________')
func(*args)
print('________')
return wrap
@decor
def print_text():
print('hello world')
print_text()
#结果 ————————————
hello world
____________
就是在print_text定义这个函数之前,加入@decor 表示的意识就是把decor 函数作为print_text函数的装饰器 .
如果print_text需要传入参数,在定义装饰器的时候一定要 写成wrap(*args),这代表 你传入什么函数都行,都能接收。
一个函数可以有多个装饰器。
774

被折叠的 条评论
为什么被折叠?



