Python中的装饰器与函数修饰器实践

心灵捕手1 2019-06-23T14:20:35+08:00
0 0 237

引言

在Python中,装饰器是一种强大的工具,可以修改已有的函数或者类的行为,而又不需要修改它们的源代码。使用装饰器可以在不改变函数结构的情况下,添加额外的功能或者修饰函数的行为。本篇博客将介绍Python中的装饰器和函数修饰器,并讨论它们的具体应用场景和实践。

装饰器的基本概念

装饰器是Python中比较常用的一种设计模式。它实际上是一个用来增强函数功能的函数,它接受一个函数作为参数并返回一个新的函数,该新函数在原函数的基础上添加了额外的功能。

装饰器可以用于函数、类甚至是方法。装饰器的语法由@符号和装饰器函数组成,它放置在被修饰函数或类的定义之前。

函数修饰器实践

1. 添加日志功能

一个常用的应用场景是为函数添加日志功能,在函数被调用时输出函数的名称和参数信息。下面是一个示例:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f'Calling function {func.__name__} with args {args} {kwargs}')
        return func(*args, **kwargs)
    return wrapper

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

print(add(2, 3))

输出结果为:

Calling function add with args (2, 3) {}
5

2. 计时功能

另一个常用场景是为函数添加计时功能,以记录函数的执行时间。下面是一个示例:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        execution_time = end_time - start_time
        print(f'Function {func.__name__} executed in {execution_time} seconds.')
        return result
    return wrapper

@timer
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))

输出结果为:

Function fibonacci executed in 0.015180826187133789 seconds.
55

3. 缓存功能

在某些情况下,我们希望在函数被多次调用时,将计算结果缓存起来,以减少重复计算的开销。下面是一个示例:

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

@cache
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))
print(fibonacci(10))

输出结果为:

55
55

总结

本篇博客介绍了Python中的装饰器和函数修饰器的基本概念,并通过实践演示了几个常见的装饰器应用场景。装饰器是Python中非常强大且常用的工具,可以为函数添加额外的功能,如日志、计时、缓存等。通过使用装饰器,我们可以在不改变函数结构的情况下,方便地为函数添加各种功能和修饰行为。

相似文章

    评论 (0)