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

Python函数 - 装饰器函数的使用方法和实际应用

发布时间:2023-06-21 17:46:11

装饰器是Python中非常强大和常用的一种编程技巧,可以让我们在不改变原有代码的基础上,对其进行功能增强或调整。它可以在代码执行时动态地修改函数或类的行为和属性,是Python语言中对函数的一种高级使用方法。

1. 理解装饰器函数:

在Python中,装饰器本质上是一个Python函数,可以接受函数对象作为参数,并返回一个新函数对象(有时也可以是原函数对象)。它可以在不改变代码的情况下,用于修改或增强函数的功能,比如添加日志记录、缓存、权限校验等。通常情况下,装饰器函数被用来包装其他函数或方法,以达到增加或者修改原函数或方法功能的目的。

2. 装饰器函数的基本结构

装饰器函数的基本结构如下:

def decorator(func):
    def wrapper(*args, **kwargs):
        # 执行前置操作
        ret = func(*args, **kwargs)
        # 执行后置操作
        return ret
    return wrapper

装饰器函数 decorator 传入一个函数对象 func 作为参数,内部定义了一个新的函数 wrapper,并返回 wrapper 函数对象。wrapper 函数实现了对原函数 func 的包装,执行前可以执行一些自己的逻辑,执行完原函数之后也可以执行一些其他操作,最后将原函数 func 的返回值返回。

3. 装饰器的使用方法

装饰器函数的使用方法非常简单,只需要在需要装饰的函数前添加 @decorator 的语法糖即可,如下所示:

@decorator
def some_function(a,b,c):
    pass

以上代码等效于执行 some_function = decorator(some_function)。即在函数定义前使用 @decorator 语法糖装饰函数 some_function,相当于对 some_function 进行了包装操作,执行 some_function 函数实际上是执行 wrapper 函数。

4. 装饰器函数的实际应用

装饰器函数在实际开发中有非常广泛的应用,常见的用法如下:

(1) 函数执行前后处理

例如,可以使用装饰器打印函数执行前的时间和执行时间:

import time

def log_time(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        ret = func(*args, **kwargs) # 执行原函数
        end = time.time()
        print(f"{func.__name__} running time: {end-start}")
        return ret
    return wrapper

@log_time
def my_function():
    time.sleep(3)

my_function()

运行结果为:

my_function running time: 3.0009865760803223

(2) 权限校验

在某些场景下,需要对已有函数做权限校验,只有通过校验才能执行该函数。可以定义一个装饰器函数,对访问该函数的用户进行权限校验:

def check_permission(func):
    def wrapper(*args, **kwargs):
        # 校验权限的代码
        # 检查是否允许访问
        permission = True
        if permission:
            return func(*args, **kwargs)
        else:
            return "没有权限访问该函数"
    return wrapper

@check_permission
def my_function():
    pass

(3) 缓存数据

在某些场景下,需要把某个函数的结果缓存下来,以防止重复计算、提升计算速度。可以通过定义一个缓存装饰器函数来实现此功能:

def cache(func):
    saved_values = {}
    def wrapper(*args):
        if args in saved_values:
            return saved_values[args]
        else:
            result = func(*args)
            saved_values[args] = result
            return result
    return wrapper

@cache
def my_function(x):
    return x + 100

以上代码定义了一个缓存装饰器函数 cache,其中 saved_values 指保存缓存结果的字典对象。每次调用 my_function 函数时,先检查传入参数是否已经有缓存结果,如果有,则直接返回缓存结果,否则执行 my_function 函数计算出结果保存到缓存中。