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

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

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

在Python中,装饰器是一种强大的语法特性,它允许我们在不修改原函数代码的情况下,为函数添加新功能。这种基于闭包的语法糖,让代码变得更加优雅和可复用。

装饰器基础

装饰器的本质是一个接受函数作为参数的高阶函数。最基本的装饰器形式如下:

def my_decorator(func):
    def wrapper():
        print("函数执行前")
        func()
        print("函数执行后")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

输出:

函数执行前
Hello!
函数执行后

实用场景

  1. 性能监控:计算函数执行时间
  2. 权限验证:检查用户权限后再执行函数
  3. 日志记录:自动记录函数调用信息
  4. 缓存机制:实现函数结果的缓存

带参数的装饰器

装饰器还可以接受参数,提供更大的灵活性:

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

@repeat(num_times=3)
def greet(name):
    print(f"Hello {name}")

greet("World")

最佳实践

使用functools.wraps可以保留原函数的元信息,这是编写装饰器时的良好习惯:

from functools import wraps

def timer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 计时逻辑
        return func(*args, **kwargs)
    return wrapper

装饰器让代码更加模块化和可维护,是每个Python开发者都应该掌握的利器。通过合理使用装饰器,我们可以写出更加简洁、优雅的代码。

相关文章
|
1月前
|
安全 Java 编译器
为什么你的Java代码需要泛型?类型安全的艺术
为什么你的Java代码需要泛型?类型安全的艺术
158 98
|
1月前
|
开发者 Python
Python列表推导式:优雅与效率的完美结合
Python列表推导式:优雅与效率的完美结合
317 116
|
4天前
|
PHP C语言 开发者
告别循环!用这些PHP数组函数提升你的代码效率
告别循环!用这些PHP数组函数提升你的代码效率
177 115
|
1月前
|
Java API 开发者
告别 NullPointerException:拥抱 Java Optional
告别 NullPointerException:拥抱 Java Optional
196 117
|
1月前
|
Java 测试技术 API
Java Stream API:被低估的性能陷阱与优化技巧
Java Stream API:被低估的性能陷阱与优化技巧
258 114
|
10天前
|
Java 开发者 Spring
不止于代码:如何写出吸引人的技术博客?
不止于代码:如何写出吸引人的技术博客?
163 112
|
10天前
|
前端开发 开发者
不止于代码:如何写出吸引人的技术博客?
不止于代码:如何写出吸引人的技术博客?
151 115
|
1月前
|
PHP 开发者
PHP类型声明:让你的代码更健壮
PHP类型声明:让你的代码更健壮
212 108
|
1月前
|
Java API 数据处理
告别繁琐循环:用Java Stream优雅处理集合
告别繁琐循环:用Java Stream优雅处理集合
235 110