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

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

发布时间:2023-06-16 16:08:20

装饰器是Python中常用的一种语法结构,它可以在不改变原函数代码的前提下,对函数进行扩展、修改或包装等操作。这种语法结构极大地方便了Python程序员的开发工作。下面将对Python中装饰器的用法及常见示例进行介绍。

1. 装饰器的基本语法

Python中装饰器的基本语法如下:

def decorator_func(func):
    def wrapper(*args, **kwargs):
        # do something before calling the original function
        result = func(*args, **kwargs)
        # do something after calling the original function
        return result
    return wrapper

@decorator_func
def original_func(*args, **kwargs):
    # do something
    return result

在这个示例中,装饰器函数decorator_func接受一个函数作为参数,并返回一个新的函数wrapperwrapper函数包装了原函数original_func,在调用original_func之前和之后可以进行一些操作。使用@decorator_fucn语法糖可以简化函数装饰器的调用方式,使代码更加简洁。

2. 装饰器的常见示例

下面介绍几种常见的装饰器示例。

2.1 计时器装饰器

计时器装饰器是常见的一种装饰器,它可以用来记录函数的执行时间。示例代码如下:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("Time used: {} seconds".format(end_time - start_time))
        return result
    return wrapper

@timer
def my_func(*args, **kwargs):
    # do something
    return result

使用time模块来计算函数执行时间,将计时器装饰器作为@语法糖来使用,将计时器装饰器加在my_func函数上,就可以实现计时功能。

2.2 缓存装饰器

缓存装饰器可以将函数的执行结果进行缓存,当函数再次调用时,如果输入参数相同,可以直接取出缓存结果,不必重新计算。示例代码如下:

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

@cache
def my_func(*args):
    # do something
    return result

函数的执行结果被缓存在一个字典中,当输入参数相同时,可以直接从字典中取出结果,避免了重新计算的过程。

2.3 日志装饰器

日志装饰器可以用来记录函数的调用日志,以及参数和返回值等信息。示例代码如下:

def logger(func):
    def wrapper(*args, **kwargs):
        arg_str = ", ".join(repr(arg) for arg in args)
        kwarg_str = ", ".join("{}={}".format(k, v) for k, v in kwargs.items())
        signature = "{}({})".format(func.__name__, ", ".join([arg_str, kwarg_str]))
        print("Starting {}".format(signature))
        result = func(*args, **kwargs)
        print("Finished {} with result {}".format(signature, result))
        return result
    return wrapper

@logger
def my_func(*args, **kwargs):
    # do something
    return result

使用repr函数将参数转换成字符串的形式,记录函数的调用日志,以及参数和返回值等信息。

3. 总结

装饰器是Python中非常重要的一种语法结构,它可以在不改变原函数代码的前提下,对函数进行扩展、修改或包装等操作,这种语法结构极大地方便了Python程序员的开发工作。本文介绍了装饰器的基本语法和常见示例,在实际开发中应该根据需要选择合适的装饰器进行使用。