欢迎访问宙启技术站
智能推送

Python函数装饰器的用法介绍和实例讲解

发布时间:2023-07-06 15:17:29

Python函数装饰器是Python语言的一个重要特性,它可以在不改变原有函数代码的情况下,为函数添加额外的功能。函数装饰器是一种函数,它接受一个函数为参数,并返回一个新的函数。

函数装饰器具有以下特点:

1. 函数装饰器是一个高阶函数,接受一个函数作为参数,返回一个函数。

2. 函数装饰器可以用来装饰任意可调用对象,如函数、类、静态方法、类方法等。

3. 函数装饰器可以在源代码中的任何位置使用,因为它是在编译阶段执行的。

函数装饰器的基本用法如下所示:

def decorator_function(func):
    def wrapper(*args, **kwargs):
        # 执行一些额外的操作
        result = func(*args, **kwargs)
        # 执行一些额外的操作
        return result
    return wrapper

@decorator_function
def my_function():
    # 函数代码
    pass

在上述代码中,我们定义了一个名为decorator_function的装饰器函数。它接受一个函数func作为参数,并返回了一个新的函数wrapperwrapper函数包装了原始的函数func,在执行原始函数之前和之后执行了一些额外的操作。

为了使用函数装饰器,我们使用@decorator_function的语法将装饰器应用到目标函数my_function上。这样,当我们调用my_function时,实际上是在调用wrapper函数。

函数装饰器可以用于许多不同的用途,下面是几个例子:

1. 日志记录

import logging

def log_decorator(func):
    def wrapper(*args, **kwargs):
        logging.info(f"Calling function {func.__name__}")
        result = func(*args, **kwargs)
        logging.info(f"Function {func.__name__} called successfully")
        return result
    return wrapper

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

print(add(2, 3))

在上述代码中,我们定义了一个名为log_decorator的装饰器函数,它用于记录函数的调用。当我们调用add函数时,log_decorator装饰器会在函数执行前输出一条日志,并在函数执行后输出另一条日志。

2. 计时器

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Elapsed time: {end_time - start_time} seconds")
        return result
    return wrapper

@timer_decorator
def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)

print(factorial(5))

在上述代码中,我们定义了一个名为timer_decorator的装饰器函数,用于计算函数的执行时间。当我们调用factorial函数时,timer_decorator装饰器会在函数执行前记录开始时间,并在函数执行后计算并打印函数的执行时间。

3. 权限验证

def check_permission_decorator(permission):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if permission == "admin":
                print("Permission granted")
                return func(*args, **kwargs)
            else:
                print("Permission denied")
        return wrapper
    return decorator

@check_permission_decorator(permission="admin")
def delete_file(filename):
    print(f"Deleting file {filename}")

delete_file("test.txt")

在上述代码中,我们定义了一个名为check_permission_decorator的装饰器,用于检查用户权限。当我们调用delete_file函数时,check_permission_decorator(permission="admin")装饰器会首先检查用户权限,如果权限为"admin",则允许执行函数,否则拒绝执行。

总结:函数装饰器是一种强大而灵活的特性,它可以为函数增加额外的功能,如日志记录、计时器、权限验证等。通过函数装饰器,我们可以实现代码的重用和扩展,提高代码的可维护性和可测试性。