Skip to content
0
/ Python/装饰器
3/14/2026
1.2m
AI 摘要

Python 装饰器本质是高阶函数,用于封装逻辑。支持带参数的装饰器,可通过类实现更灵活的控制,如 logit 示例所示。

装饰器

从 Typescript 开发者的视角来看 python 的装饰器

Overview

下面是一个简单的装饰器示例,展示了如何使用 fastapi 的装饰器来添加路由

from fastapi import APIRouter

router = APIRouter()

@router.get("/")
def read_root():
    return {"Hello": "World"}

高阶函数

和 TS 中的装饰器一致,python 中的装饰器本质上也是高阶函数,即返回了函数的函数

def logit(func):
    def wrapper(*args, **kwargs):
        print("logit")
        return func(*args, **kwargs)
    return wrapper

@logit
def do_something():
    print("do_something")

do_something()

装饰器也允许接收参数,但是如果要接收参数,那么装饰器就需要返回一个函数,这个函数再接收被装饰的函数作为参数

def logit(params):
    def decorated(func):
        def wrapper(*args, **kwargs):
            print(f"logit[{params}]")
            return func(*args, **kwargs)
        return wrapper
    return decorated

@logit('info')
def do_something():
    print("do_something")

do_something()

但是这样写似乎太麻烦了,为了传参数而多定义了一层,所以 python 提供了一种类装饰器的写法

from functools import wraps

class logit:
    def __init__(self, params):
        self.params = params
    def __call__(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print(f"logit[{self.params}]")
            return func(*args, **kwargs)
        return wrapper

@logit('info')
def do_something():
    print("do_something")

do_something()

Released under the MIT License.