想象你是一个装修公司的老板。
1.你的核心业务:刷墙
你有一群工人,他们的只会一件事:刷白墙。
| |
defbrush_wall(): print("正在刷白墙...")
|
2.突发需求:客户要“贴金边”
现在客户提出了新要求:所有的墙刷完后,都要在外面贴一层金边。
- •笨办法:让每个工人都去学怎么贴金边,改掉他们原本刷墙的动作。
- •装饰器的办法
这个学徒(装饰器)的工作流程是这样的:
3.用代码演练一遍这个过程
我们先写这个“贴金边的学徒”(装饰器):
| |
# 装饰器:这个学徒负责收编工人 defgold_border_decorator(worker):
# 这里的 wrapper 就是“带了金边的装修任务” defwrapper(): worker() # 1. 让原来的工人干活(刷墙) print("✨ 贴上一层金边 ✨") # 2. 学徒额外加活
return wrapper # 把这个“升级版”的任务交出去
|
现在,你只需要在刷墙工人头上打个招呼:
| |
@gold_border_decorator defbrush_wall(): print("正在刷白墙...")
# 现在执行刷墙 brush_wall()
|
输出结果:
正在刷白墙...
✨ 贴上一层金边 ✨
4. 关键点:为什么不直接改 brush_wall 函数?
这就是装饰器最牛的地方。请看以下三个场景:
- 如果你有 100 个工人(有的刷墙、有的铺地、有的修水管),客户都要加金边。你只需要在 100 个函数头上都写个
@gold_border_decorator。你不用去改这 100 个人的工作手册。 - 如果客户突然不要金边了。你只需要删掉那行
@ 开头的代码,工人们还是原来的纯粹工人,不用重新培训。 - 原函数不知道自己被“装饰”了。
brush_wall 觉得自己只是在刷墙,它并不知道外面有人偷偷给它加了金边。
5.总结:装饰器到底在干嘛?
当你写下 @my_decorator 的时候,你实际上是在告诉 Python:
“嘿,Python!当有人调用下面这个函数时,别直接运行它。先把它塞进 my_decorator 那个‘加工厂’里,跑一跑加工厂里的额外逻辑,然后再顺便运行它。”