Python 装饰器:让你的代码瞬间高大上!
2025-02-13 08:57 阅读(62)

在Python中,装饰器(Decorator)是一种非常强大的工具。它让你能够在不改变函数本身代码的前提下,动态地扩展或修改函数的功能。简而言之,装饰器就是一个接受函数作为参数,并返回一个增强版函数的函数。通过装饰器,你可以使代码更简洁、更具可读性,同时避免重复的代码。本文将为你详细介绍Python装饰器的概念、使用方法、以及一些实际应用场景,帮助你快速掌握这一技巧。

一、装饰器的基本概念

装饰器本质上是一个返回函数的函数。它接受一个函数作为参数,并返回一个经过包装或修改后的新函数。我们可以通过Python的@语法糖来简化装饰器的使用。

以下是一个简单的装饰器示例:

def simple_decorator(func):
    def wrapper():
        print("执行装饰器前的操作")
        func()  # 调用原函数
        print("执行装饰器后的操作")
    return wrapper

@simple_decorator
def greet():
    print("Hello, World!")

在上面的代码中,simple_decorator是一个装饰器,它接受greet函数作为参数,并在greet函数执行之前和之后分别打印一些信息。@simple_decorator是装饰器的应用方式,相当于:

greet = simple_decorator(greet)

当你运行greet()时,输出将是:

执行装饰器前的操作
Hello, World!
执行装饰器后的操作

二、装饰器的工作原理


函数作为一等公民:在Python中,函数是“一等公民”,意味着函数可以作为参数传递给其他函数,也可以作为返回值返回给其他函数。

闭包:装饰器内部使用了闭包原理。装饰器返回的wrapper函数能够访问外部函数simple_decorator的作用域,因此可以在原始函数执行前后插入自己的逻辑。


三、装饰器的参数

装饰器不仅仅局限于不带参数的函数。如果原函数有参数,装饰器也需要能处理这些参数。这时,我们可以通过*args和**kwargs来接收不定数量的参数。

def decorator_with_args(func):
    def wrapper(*args, **kwargs):
        print(f"参数: {args}, 关键字参数: {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@decorator_with_args
def greet_person(name, age):
    print(f"Hello {name}, you are {age} years old.")

greet_person("Alice", 30)

输出:

参数: ('Alice', 30), 关键字参数: {}
Hello Alice, you are 30 years old.

四、内置装饰器

Python还提供了一些常用的内置装饰器。例如:


@staticmethod 和 @classmethod:用于定义静态方法和类方法。

@property:用于将方法转换为属性。

https://www.zuocode.com

五、实际应用场景


日志记录:在很多情况下,我们希望记录每个函数的调用信息。通过装饰器,可以轻松地为函数添加日志功能。

def log(func):
    def wrapper(*args, **kwargs):
        print(f"调用 {func.__name__} 函数,参数: {args}, 关键字参数: {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log
def add(a, b):
    return a + b

add(3, 5)

输出:

调用 add 函数,参数: (3, 5), 关键字参数: {}

权限控制:你可以使用装饰器来检查用户权限、身份验证等。

def requires_permission(func):
    def wrapper(*args, **kwargs):
        if not user_has_permission():  # 假设这是一个检查权限的函数
            print("没有权限访问该功能!")
            return
        return func(*args, **kwargs)
    return wrapper

@requires_permission
def delete_file(file_name):
    print(f"删除文件:{file_name}")

性能优化:装饰器可以用来度量函数的执行时间,帮助你分析程序的性能瓶颈。

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} 执行时间: {end - start} 秒")
        return result
    return wrapper

@timing_decorator
def long_running_task():
    time.sleep(2)

long_running_task()

输出:

long_running_task 执行时间: 2.0007011890411377 秒

六、总结

装饰器是Python中的一项非常实用的功能,能够帮助我们将额外的功能与核心逻辑解耦,使代码更简洁、易维护。通过装饰器,我们可以灵活地在不改变原始函数的情况下,增加日志、性能监控、权限验证等功能。在实际开发中,掌握装饰器的使用,将极大地提升你的编程水平。


作者:烛阴

链接:https://juejin.cn