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

Python装饰器函数——装饰器函数的概念和实例应用

发布时间:2023-05-27 20:18:39

1. 装饰器函数的概念

装饰器函数是指一个可以接收一个函数作为参数,并返回一个新函数的函数。在Python中,装饰器函数通常用于对已有的代码进行修改或添加新的功能,在代码执行原有功能的同时,还实现了额外的功能。以此实现代码的复用性、灵活性和可维护性。

装饰器函数通常被应用在以下几个场景:

1. 计算函数执行时间、打印函数执行日志;

2. 对函数的参数进行验证、处理;

3. 缓存函数的执行结果;

4. 对函数进行授权、权限验证。

2. 装饰器函数的实例应用

下面我们来看几个具体的装饰器函数的实例应用。

2.1 计算函数执行时间

我们可以定义一个装饰器函数计算函数的执行时间,如下所示:

import time

def time_it(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'{func.__name__} took {end_time - start_time:.2f} seconds to execute.')
        return result
    return wrapper

@time_it
def some_function(some_arg):
    time.sleep(2)
    return f'Result: {some_arg}'

result = some_function('Hello, world!')
print(result)

该装饰器函数在计算函数执行时间的同时,还保留了函数原有的功能。

2.2 缓存函数的执行结果

我们可以定义一个装饰器函数对函数的执行结果进行缓存,以此加快函数的执行速度,如下所示:

cache = {}

def memoize(func):
    def wrapper(*args):
        if args in cache:
            print(f'Found result for {args} in cache.')
            return cache[args]
        else:
            result = func(*args)
            cache[args] = result
            return result
    return wrapper

@memoize
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))

该装饰器函数将函数的执行结果存储到一个字典中,以便在下次执行函数时,直接从缓存中获取结果。

2.3 授权函数的执行权限

我们可以定义一个装饰器函数对函数的执行权限进行授权验证,如下所示:

def authenticated(func):
    def wrapper(*args, **kwargs):
        username = input('Enter your username: ')
        password = input('Enter your password: ')
        if username == 'admin' and password == '123456':
            return func(*args, **kwargs)
        else:
            raise Exception('Invalid username or password')
    return wrapper

@authenticated
def some_function():
    print('You have been granted access.')

some_function()

该装饰器函数在执行函数之前,会验证用户的用户名和密码,只有验证通过的用户才能执行该函数。

3. 总结

装饰器函数是Python中一个非常有用的工具,它可以帮助我们实现代码的复用性、灵活性和可维护性。在实际应用中,我们可以根据具体需求定义不同的装饰器函数,以实现不同的功能。