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。掌握它,你的编程风格将迈上新台阶。

目录
相关文章
|
4月前
|
存储 Python 容器
简化Python类:使用数据类(dataclasses)
简化Python类:使用数据类(dataclasses)
449 18
|
4月前
|
搜索推荐 安全 BI
千人千面,权限到人:Quick BI 赋能数据嵌入业务,驱动用户体验从“要我用”到“我要用”
数据报表的价值在于“无声融入”业务流程、“精准匹配”角色需求。Quick BI增强嵌入方案支持免登安全接入、千人千面权限控制,将仪表板、表格等无缝嵌入现有系统,让数据真正“随需而见、所见即所得”,打通数据驱动落地的最后一公里。
|
7月前
|
安全 PHP 数据库
告别繁琐循环:用array_map与array_filter优雅处理PHP数组
告别繁琐循环:用array_map与array_filter优雅处理PHP数组
493 132
|
2月前
|
安全 数据库 Python
让Python代码更优雅:深入理解上下文管理器
让Python代码更优雅:深入理解上下文管理器
262 134
|
4月前
|
存储 人工智能 运维
拒绝“Demo 级”架构:基于 SAE × SLS 构建 Dify 高可用生产底座
本文是Dify生产化系列第二篇,详解如何用阿里云SAE(Serverless应用引擎)与SLS(日志服务)构建弹性、免运维的AI计算底座:SAE实现秒级扩缩容与50倍QPS跃升,SLS支撑存算分离与实时业务洞察,一站式解决运维复杂、流量潮汐、数据库膨胀等核心瓶颈。
|
3月前
|
安全 PHP
PHP 技巧:5 个提升代码质量的实用写法
PHP 技巧:5 个提升代码质量的实用写法
277 144
|
3月前
|
数据库连接 索引 Python
5个让你代码更优雅的Python技巧
5个让你代码更优雅的Python技巧
263 139
|
4月前
|
Oracle Java 关系型数据库
JDK 21安装教程 Windows版详细步骤+环境变量验证(含java/javac/java -version检测)
JDK(Java SE Development Kit)是Oracle官方提供的Java标准版开发工具包,包含编译器(javac)、运行环境(JRE)及核心类库等,用于Java程序的开发、编译、调试与运行。本文详解JDK 21在Windows下的下载、安装与验证步骤,助力新手快速搭建开发环境。(239字)
2957 114
|
4月前
|
人工智能 弹性计算 自然语言处理
2026年阿里云部署OpenClaw(Clawdbot)一键接入WhatsApp喂饭级教程
2026年,OpenClaw(前身为Clawdbot、Moltbot)凭借开源轻量化架构、跨平台无缝适配能力及强大的AI自动化执行功能,成为个人、跨境团队及中小企业搭建专属AI助手的首选工具。其核心优势在于无需复杂开发,即可快速对接WhatsApp等全球主流通信平台,实现“WhatsApp发送自然语言指令→阿里云服务器运行OpenClaw执行任务→结果实时反馈至WhatsApp”的闭环,适配跨境沟通、客户服务、远程协作、日常办公等多场景,彻底打破“AI工具与日常沟通脱节”的痛点。
885 5