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

目录
相关文章
|
7月前
|
存储 Python 容器
简化Python类:使用数据类(dataclasses)
简化Python类:使用数据类(dataclasses)
601 18
|
8月前
|
SQL 安全 网络安全
从黑客视角看SQL注入:你的数据真的安全吗?
从黑客视角看SQL注入:你的数据真的安全吗?
387 138
|
9月前
|
缓存 监控 数据安全/隐私保护
Python装饰器:让代码优雅加倍
Python装饰器:让代码优雅加倍
309 116
|
10月前
|
安全 PHP 数据库
告别繁琐循环:用array_map与array_filter优雅处理PHP数组
告别繁琐循环:用array_map与array_filter优雅处理PHP数组
547 132
|
10月前
|
Java API 数据处理
掌握Java Stream API:告别繁琐循环,拥抱高效编程
掌握Java Stream API:告别繁琐循环,拥抱高效编程
344 137
|
7月前
|
数据采集 人工智能 监控
别让大模型“学废了”!从数据清洗到参数调优,一次讲透微调实战
本文深入浅出讲解大模型微调(Fine-tuning):为何需要“岗前培训”,如何通过数据准备、参数调优(如LoRA)、训练监控与效果评估,让通用模型精准适配专业场景。强调“数据质量>数量”“监控胜过猜测”,助力开发者高效落地AI定制化应用。(239字)
1320 4
|
7月前
|
Oracle Java 关系型数据库
JDK 21安装教程 Windows版详细步骤+环境变量验证(含java/javac/java -version检测)
JDK(Java SE Development Kit)是Oracle官方提供的Java标准版开发工具包,包含编译器(javac)、运行环境(JRE)及核心类库等,用于Java程序的开发、编译、调试与运行。本文详解JDK 21在Windows下的下载、安装与验证步骤,助力新手快速搭建开发环境。(239字)
3358 114
|
6月前
|
数据库连接 索引 Python
5个让你代码更优雅的Python技巧
5个让你代码更优雅的Python技巧
281 139
|
6月前
|
安全 PHP
PHP 技巧:5 个提升代码质量的实用写法
PHP 技巧:5 个提升代码质量的实用写法
316 144
|
12月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理

热门文章

最新文章