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

装饰器函数在Python中的实现

发布时间:2023-08-20 14:47:48

装饰器是Python中一种有用的编程模式,它能够扩展已有函数的功能,而又不需要修改其原代码。在Python中,装饰器是一个可调用对象,它接受一个函数作为输入,并返回另一个函数作为输出。

装饰器通常用于添加额外的功能,例如日志记录、输入检查、性能分析等。它能够在不修改函数代码的情况下,对函数进行动态的修改和扩展。下面是装饰器函数在Python中的实现方式:

1. 使用函数定义装饰器:装饰器实际上是一个普通的Python函数,它接受一个函数作为输入,并返回另一个函数作为输出。以下是一个简单的装饰器例子,用于在函数调用前后打印日志:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} executed")
        return result
    return wrapper

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

print(add(1, 2))  # 输出:Calling function add,3,Function add executed

2. 使用类定义装饰器:除了使用函数定义装饰器外,还可以使用类定义装饰器。类装饰器需要实现 __call__ 方法,并接受一个函数作为输入。以下是一个类装饰器的例子,用于计算函数的执行时间:

import time

class Timer:
    def __init__(self, func):
        self.func = func
        
    def __call__(self, *args, **kwargs):
        start_time = time.time()
        result = self.func(*args, **kwargs)
        end_time = time.time()
        execution_time = end_time - start_time
        print(f"Function {self.func.__name__} executed in {execution_time} seconds")
        return result

@Timer
def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(5))  # 输出:Function factorial executed in 1.811981201171875e-06 seconds,120

3. 装饰器链:装饰器可以链式调用,即一个装饰器的输出可以作为另一个装饰器的输入。以下是一个使用了两个装饰器的例子,用于输入检查和类型转换:

def input_check(func):
    def wrapper(*args, **kwargs):
        if not all(isinstance(arg, (int, float)) for arg in args):
            raise TypeError("Input arguments must be numeric")
        return func(*args, **kwargs)
    return wrapper

def type_conversion(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        if isinstance(result, int):
            return float(result)
        elif isinstance(result, float):
            return int(result)
        else:
            return result
    return wrapper

@input_check
@type_conversion
def divide(a, b):
    return a / b

print(divide(5, 2))  # 输出:2.5
print(divide(5, 0))  # 输出:TypeError: Input arguments must be numeric

装饰器是Python中非常有用的编程技巧之一,它可以为函数添加额外的功能、提高代码的复用性和可读性。通过函数和类的方式,我们可以自由地定义各种各样的装饰器,来适应不同的需求。