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

目录
相关文章
|
1月前
|
安全 数据库连接 数据库
掌握Python上下文管理器:优雅资源管理的艺术
掌握Python上下文管理器:优雅资源管理的艺术
242 155
|
5天前
|
索引 Python
5个让代码更Pythonic的小技巧
5个让代码更Pythonic的小技巧
299 135
|
5天前
|
JavaScript 前端开发
JavaScript小技巧:数组去重的几种优雅写法
JavaScript小技巧:数组去重的几种优雅写法
327 142
|
1月前
|
数据采集 API 数据处理
Python异步编程:告别阻塞,拥抱高效
Python异步编程:告别阻塞,拥抱高效
228 136
|
1月前
|
数据处理 Python
Python 3.10+ 新宠:模式匹配的实战应用
Python 3.10+ 新宠:模式匹配的实战应用
193 132
|
18天前
|
Go 数据库 微服务
Go语言技巧:利用Context实现优雅的超时控制
Go语言技巧:利用Context实现优雅的超时控制
197 129
|
5天前
|
Java
Java开发中三个实用的代码技巧
Java开发中三个实用的代码技巧
300 142
|
18天前
|
PHP
PHP 开发中你可能忽略的 3 个实用技巧
PHP 开发中你可能忽略的 3 个实用技巧
196 138
|
4天前
|
存储 C语言 内存技术
C语言深度解析:大小端字节序——多字节数据的底层存储规则
大小端指CPU对多字节数据在内存中的存放顺序:大端高字节存低地址,小端反之。x86/ARM默认小端,网络字节序统一为大端。跨平台、网络通信、二进制协议开发中必须显式处理字节序转换,否则数据解析必错。
341 138
|
18天前
|
Go
Go技巧:用溢出处理提升代码健壮性
Go技巧:用溢出处理提升代码健壮性
194 136

热门文章

最新文章