Python装饰器:优雅地增强函数功能

简介: Python装饰器:优雅地增强函数功能

Python装饰器:优雅地增强函数功能

在Python开发中,我们常常需要在已有函数上增加日志、计时、权限校验等额外功能。如果直接修改函数代码,不仅破坏开闭原则,还会导致重复代码。装饰器(Decorator)正是解决这一问题的利器——它让你在不改动函数源码的前提下,为函数“穿上”新的能力。

装饰器本质:函数也是对象

装饰器本质上是一个可调用对象(通常是函数),它接收一个函数作为参数,并返回一个新的函数。来看一个最简单的例子:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数:{func.__name__}")
        return func(*args, **kwargs)
    return wrapper

def add(x, y):
    return x + y

# 手动装饰
add = logger(add)

Python提供的@语法糖让这个过程更加直观:

@logger
def add(x, y):
    return x + y

实战:计时装饰器

假设我们需要测量多个函数的执行时间,写一个计时装饰器可以一劳永逸:

import time
from functools import wraps

def timer(func):
    @wraps(func)  # 保留原函数的元信息
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        print(f"{func.__name__} 耗时:{end - start:.4f}秒")
        return result
    return wrapper

@timer
def slow_task():
    time.sleep(1)
    return "完成"

slow_task()  # 输出:slow_task 耗时:1.0002秒

这里使用了functools.wraps,它能将原函数的__name____doc__等属性复制到包装函数上,避免调试时混淆。

带参数的装饰器

有时我们希望装饰器本身接收参数,只需再嵌套一层:

def repeat(times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(times=3)
def greet():
    print("你好!")

greet()  # 打印三次“你好!”

总结

装饰器是Python“语法糖”中的典范,它基于闭包高阶函数,实现了关注点分离。无论是框架开发(Flask路由、Django权限)还是日常工具库,装饰器都能让代码更简洁、更Pythonic。掌握它,你的编程风格将迈上新台阶。

目录
相关文章
|
9小时前
|
存储 Python 容器
简化Python类:使用数据类(dataclasses)
简化Python类:使用数据类(dataclasses)
20 0
|
9小时前
|
安全 数据库连接 数据库
掌握Python上下文管理器:优雅资源管理的艺术
掌握Python上下文管理器:优雅资源管理的艺术
22 0
|
11天前
|
NoSQL 大数据 Python
用 Python 处理大数据?两个技巧让你的 Pandas 快 10 倍
用 Python 处理大数据?两个技巧让你的 Pandas 快 10 倍
159 82
|
16小时前
|
人工智能 JavaScript 安全
Openclaw的安装部署及免费API集成教程
OpenClaw 是一款开源 AI 代理框架,支持 Discord 等平台。要求 Node.js ≥22、4GB+ 内存,推荐 macOS/Linux 或 WSL2。提供一键脚本安装、向导式配置(含 Bot 权限、频道 ID、API 接入如 Canopy Wave)、后台服务与 TUI 交互,支持更新、日志与健康检查。(239 字)
84 0
|
19天前
|
Go API 数据库
Go并发实战:轻松构建高性能工作池
Go并发实战:轻松构建高性能工作池
142 87
|
19天前
|
安全 Go
Go并发模式:用goroutine和channel实现高效管道
Go并发模式:用goroutine和channel实现高效管道
128 86
|
11天前
|
设计模式 缓存 监控
Python装饰器:让代码既优雅又高效
Python装饰器:让代码既优雅又高效
114 70
|
19天前
|
JSON 运维 Go
为什么Go语言成为开发者新宠?
为什么Go语言成为开发者新宠?
160 63
|
4天前
|
数据采集 数据处理 Python
Python异步编程入门:告别等待,拥抱高效
Python异步编程入门:告别等待,拥抱高效
|
24天前
|
人工智能 机器人 测试技术
用提示工程让大模型自己检查自己:CoVe方法有效减少幻觉
Chain-of-Verification(CoVe)通过“起草-验证-修复”四步流程,让大模型自我纠错幻觉。关键在于隔离验证:隐去初稿,迫使模型独立核查事实,避免自我强化错误。适用于模型应知但易错的场景,与RAG互补。虽增加延迟与成本,却为高可靠性任务提供保障,是迈向“系统2思维”的重要一步。
194 33
用提示工程让大模型自己检查自己:CoVe方法有效减少幻觉