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

Python装饰器函数的用法及常见示例

发布时间:2023-06-23 17:43:00

Python中的装饰器,可以认为是一种特殊的函数,它能够为其他函数添加额外的功能。本文将详细介绍Python装饰器的用法及常见示例,并为读者提供相关的代码示例和说明。

1. 装饰器函数的定义

Python中的装饰器函数就是一个函数,它的参数是一个函数,返回值也是一个函数。通常情况下,装饰器函数被定义成一个函数嵌套的形式,如下:

def decorator(func):
    def wrapper(*args, **kwargs):
        #在函数func前面执行的代码
        ret = func(*args, **kwargs)
        #在函数func后面执行的代码
        return ret
    return wrapper

上述代码中,装饰器函数decorator包含了一个内部函数wrapper,wrapper函数的参数和func函数的参数一样,并且调用func函数并返回func的返回值。在wrapper函数内部可以添加一些在func执行前、后需要执行的逻辑代码。

2. 装饰器函数的调用

我们可以用@符号来调用装饰器函数,例如:

@decorator
def my_func(a, b):
    #函数体
    pass

上述代码就是使用decorator函数来装饰my_func函数,相当于执行了以下代码:

my_func = decorator(my_func)

3. 装饰器函数的常见示例

3.1 计时装饰器

计时装饰器可以用来计算函数执行时间,代码如下:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        ret = func(*args, **kwargs)
        end = time.time()
        print("函数 %s 执行时间:%f 秒" % (func.__name__, end-start))
        return ret
    return wrapper

这里使用Python的time模块来计算函数执行时间,@timer装饰器可以加在任何一个函数上,如下:

@timer
def my_func(a, b):
    #函数体
    pass

3.2 日志装饰器

日志装饰器可以用来记录函数的调用日志,代码如下:

def logger(func):
    def wrapper(*args, **kwargs):
        print("函数 %s 被调用" % func.__name__)
        ret = func(*args, **kwargs)
        print("函数 %s 调用结束,返回值为:%s" % (func.__name__, ret))
        return ret
    return wrapper

这里的logger装饰器可以用来记录函数调用的开始和结束,@logger装饰器可以加在任何一个函数上,如下:

@logger
def my_func(a, b):
    #函数体
    pass

3.3 缓存装饰器

缓存装饰器可以用来实现函数调用结果的缓存,避免重复计算,代码如下:

def cache(func):
    data = {}
    def wrapper(*args, **kwargs):
        key = args + tuple(kwargs.items())
        if key in data:
            print("已经缓存了结果")
            return data[key]
        else:
            ret = func(*args, **kwargs)
            data[key] = ret
            print("新计算结果")
            return ret
    return wrapper

这里的cache装饰器可以用来缓存函数的调用结果,@cache装饰器可以加在任何一个函数上,如下:

@cache
def my_func(a, b):
    #函数体
    pass

3.4 身份验证装饰器

身份验证装饰器可以用来验证用户的身份,代码如下:

def auth(func):
    def wrapper(*args, **kwargs):
        #先验证身份
        if 有权限:
            ret = func(*args, **kwargs)
            return ret
        else:
            print("没有权限访问该函数")
    return wrapper

这里的auth装饰器可以用来验证用户是否有访问某个函数的权限,@auth装饰器可以加在任何一个函数上,如下:

@auth
def my_func(a, b):
    #函数体
    pass

4. 注意事项

在Python中使用装饰器有一些注意事项,例如:

- 装饰器的函数名应该有意义,用于描述它所装饰的函数的功能。

- 装饰器中定义的内部函数应该继承被装饰的函数的签名,即包括参数和关键字参数。

- 装饰器中定义的内部函数应该返回被装饰函数的返回值。

- 装饰器中的逻辑代码应该放在内部函数wrapper中,而不是放在装饰器函数本身中。

5. 总结

本文详细介绍了Python装饰器的用法及常见示例,包括计时装饰器、日志装饰器、缓存装饰器、身份验证装饰器等。通过使用装饰器可以给函数添加额外的功能,提高代码的可读性和重用性,是Python编程中常用的技巧。