📜  Python中的函数装饰器示例(1)

📅  最后修改于: 2023-12-03 15:19:28.165000             🧑  作者: Mango

Python中的函数装饰器示例

在Python中,可以使用装饰器来修改函数的行为。装饰器本质上是一个函数,能够接收一个函数作为参数并返回一个新的函数。装饰器可以用于函数的包装、缓存、日志记录、性能分析等。

何时需要装饰器

Python中的装饰器可以用于:

  • 在不修改原函数代码的情况下,给函数增加额外的功能。
  • 在不修改原函数代码的情况下,修改原函数的行为。
  • 把一个函数的输出结果缓存起来,避免重复计算。
装饰器的基本语法

在Python中,装饰器的基本语法如下所示:

def decorator(func):
    def wrapper(*args, **kwargs):
        # Do something before the function is called
        result = func(*args, **kwargs)
        # Do something after the function is called
        return result
    return wrapper

@decorator
def my_function():
    # Do something
    pass

在这个示例中,装饰器decorator接收一个函数func作为参数并返回一个嵌套的函数wrapperwrapper函数接收任意数量的位置参数和关键字参数,并在原函数func被调用前后分别进行一些额外的处理。最后,装饰器返回wrapper函数作为新的函数来替代原函数。

为了使用装饰器,可以在函数定义前面加上@decorator的语法糖,这样就可以把原函数作为参数传递给装饰器,装饰器再返回一个新的函数。

装饰器示例

下面是一些实际的装饰器示例。

记录函数执行时间的装饰器
import time

def time_it(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time:.2f} seconds to run.")
        return result
    return wrapper

@time_it
def my_function():
    # Do something
    pass

这个装饰器会记录函数的执行时间,并打印出来。

缓存函数输出结果的装饰器
def memoize(func):
    cache = {}

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

    return wrapper

@memoize
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

这个装饰器会缓存函数的输出结果,在下一次执行相同的输入参数时,会直接从缓存中获取计算结果,避免重复计算。

权限验证的装饰器
def requires_permission(permission):
    def decorator(func):
        def wrapper(*args, **kwargs):
            # Check if user has permission
            if user_has_permission(permission):
                return func(*args, **kwargs)
            else:
                raise Exception("User does not have permission")
        return wrapper
    return decorator

@requires_permission("admin")
def my_function():
    # Do something
    pass

这个装饰器会对用户的权限进行验证,只有在用户具有相应的权限时才能执行函数。如果用户没有相应的权限,则会抛出异常。

结语

通过函数装饰器,我们能够在不修改原函数代码的情况下,给函数增加额外的功能。上面的三个示例只是Python中装饰器的冰山一角,实际上装饰器的应用场景非常广泛,比如缓存、日志记录、性能分析、权限验证等等。希望本文的介绍能够对Python开发人员有所帮助。