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

「Python函数」——如何使用装饰器增强函数功能?

发布时间:2023-12-03 03:14:23

装饰器是Python语言中一种强大的机制,它可以在不修改原函数代码的情况下,增加函数的功能或者修改函数的行为。使用装饰器可以提高代码的可重用性,使代码具有更好的可读性和可维护性。本文将介绍如何使用装饰器增强函数的功能。

首先,定义一个简单的函数,以便演示装饰器的用法:

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

装饰器其实就是一个函数,它接受一个函数作为参数,并返回一个新的函数。

一、增强函数功能的装饰器

1. 打印函数执行时间的装饰器

用于计算函数的执行时间,并打印出来。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数 {func.__name__} 执行时间:{end_time - start_time} 秒")
        return result
    return wrapper

通过在函数定义前面加上 @timer,即可使用装饰器来增强函数的功能:

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

2. 打印函数调用日志的装饰器

用于打印函数的调用信息,包括函数名和参数。

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数 {func.__name__},参数:{args}, {kwargs}")
        result = func(*args, **kwargs)
        return result
    return wrapper

通过在函数定义前面加上 @logger,即可使用装饰器来增强函数的功能:

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

3. 检查函数参数类型的装饰器

用于检查函数的参数类型是否正确。

def check_type(func):
    def wrapper(*args, **kwargs):
        if not all(isinstance(arg, int) for arg in args):
            raise TypeError("参数类型错误,需要整数")
        if not all(isinstance(value, int) for value in kwargs.values()):
            raise TypeError("参数类型错误,需要整数")
        result = func(*args, **kwargs)
        return result
    return wrapper

通过在函数定义前面加上 @check_type,即可使用装饰器来增强函数的功能:

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

二、带参数的装饰器

装饰器本身也可以接受参数,这样可以根据不同的参数值扩展装饰器的功能。

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

通过在函数定义前面加上 @repeat(3),即可使用带参数的装饰器来增强函数的功能,该装饰器将会重复执行函数3次:

@repeat(3)
def add(a, b):
    return a + b

以上就是使用装饰器增强函数功能的方法。装饰器可以根据需要添加多个,也可以对同一个函数添加多个装饰器。装饰器提供了一种简洁而强大的方式来扩展函数的功能,使代码更加灵活和易于维护。