Python 装饰器核心原理解析
装饰器本质上是一个接受函数作为参数并返回一个新函数的函数。它允许我们在不修改原函数代码的情况下,为函数添加额外的功能。
简单来说,装饰器就像给礼物盒包装纸。杯子(原函数)的功能是盛水,但为了美观或保护,我们给它套上一个盒子(装饰器)。盒子本身不改变杯子的用途,但赋予了它新的属性。
一、基本概念
下面通过一个例子来解释这个概念。
假设现在有一个普通函数:
def say_hello():
print("你好!")
say_hello()
# 输出:你好!
假如我们想在说'你好'之前和之后都加上一些辅助语句,传统做法是修改原函数。但使用装饰器,我们可以这样做:
def decorator(func):
# 这是具体的装饰逻辑
def wrapper():
print("准备开始啦!")
func() # 这里调用原来的函数
print("结束啦!")
return wrapper
def say_hello():
print("你好!")
# 把 say_hello 这个函数,放进 decorator 这个包装盒里
decorated_say_hello = decorator(say_hello)
# 运行包装后的新函数
decorated_say_hello()
# 输出结果:
# 准备开始啦!
# 你好!
# 结束啦!
通过上面的例子便能理解那句话:'装饰器本质上是一个接受函数作为参数并返回一个新函数的函数。'在 decorator 函数中,参数是另一个函数(func),并且最终返回了一个函数(wrapper)。
很多人对这种嵌套形式可能不太理解。可以这样想:decorator 是装饰器本身,wrapper 是包装层。就像用包装纸包裹苹果,不管材质如何,包裹后就可以说对这个苹果进行了装饰。
更简洁的写法:@ 语法
Python 提供了更简单的语法糖,直接用 @装饰器名字:
def decorator(func):
def wrapper():
()
func()
()
wrapper
():
()
say_hello()

