Python 装饰器详解
基本概念
装饰器本质上是一个接受函数作为参数并返回一个新函数的函数。它的核心作用是在不修改原函数代码的前提下,为函数添加额外的功能。
打个比方,你有一个杯子(礼物)想要送人,光送杯子可能显得单调,所以找个礼物盒(装饰器)把它装进去。这个盒子对杯子而言只是起到装饰作用,不会改变杯子盛水的功能。在 Python 中,我们可以用 A 函数对 B 函数添加功能,同时保持 B 函数代码不变,这时 A 函数就是装饰器。
先看一个普通函数:
def say_hello():
print("你好!")
say_hello()
# 输出:你好!
假如我们想在说'你好'之前和之后都加上一些提示语句,传统做法是修改原函数,但有了装饰器就不需要了。
def decorator(func):
def wrapper():
print("准备开始啦!")
func() # 调用原函数
print("结束啦!")
return wrapper
def say_hello():
print("你好!")
# 给函数「加上装饰」
decorated_say_hello = decorator(say_hello)
decorated_say_hello()
# 输出结果
# 准备开始啦!
# 你好!
# 结束啦!
通过上面的例子可以看到,decorator 接收了 func 参数,最终返回了 wrapper 函数,这就是'接受函数作为参数并返回一个新函数'的体现。
很多人对嵌套函数形式不太理解,其实逻辑很简单:decorator 是包装纸,wrapper 是包裹后的新对象,而原函数是被装饰的苹果。使用 @ 符号可以简化这种写法:
def decorator(func):
def wrapper():
print("准备开始啦!")
func()
print("结束啦!")
return wrapper
():
()
say_hello()

