Python 装饰器:从「我谢谢你」到「我爱死你了」的歇变之旅
第一次看到装饰器的心情:这就离谱
@some_magic
def my_function():
pass
这 @ 是什么鬼?
翻译成人话:装饰器就是一个给函数“套壳”的东西。
给函数穿衣服
想象一下:你光着身子出门是不行的。你得穿衣服。衣服不影响你作为人的本质功能,但给你加了点额外属性。
def make_dress(func):
def wrapper():
print("穿上西装")
func()
print("脱下西装")
return wrapper
@make_dress
def go_to_work():
print("去上班了")
看到没?还是去上班了,但被包装了一下。
实战:计时器装饰器
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 跑了 {end-start:.4f} 秒")
return result
return wrapper
@timer
def slow_function():
time.sleep(1)
进阶:带参数的装饰器
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def punch():
print("欧拉欧拉欧拉!")
像俄罗斯套娃——打开最大的,里面还有小的。
Python 自带的官方皮肤
- @staticmethod
- @classmethod
- @property
- @functools.lru_cache
- @functools.wraps
最后一句
装饰器很强大,但别为了用装饰器而用装饰器。
看到过很多新人学完后如获至宝,把所有函数都套上装饰器——像刚学会修图的人,把每张自拍都调成赛博朋克风。
好的代码像好的笑话——贵在恰到好处。