Python 装饰器:从「我谢谢你」到「我爱死你了」的歇变之旅

Python基础 Sep 25, 2024

第一次看到装饰器的心情:这就离谱

@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

最后一句

装饰器很强大,但别为了用装饰器而用装饰器。
看到过很多新人学完后如获至宝,把所有函数都套上装饰器——像刚学会修图的人,把每张自拍都调成赛博朋克风。
好的代码像好的笑话——贵在恰到好处。

Tags