Python: 高阶函数应用装饰器模式(Decorator)

2024-05-17 18:19:47 浏览数 (2)

装饰器简介

装饰器是一种设计模式,用于在不改变原函数的情况下,动态地向函数添加功能。装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。

装饰器的基本语法

装饰器的使用非常简单,只需在函数定义之前加上 @decorator_name 即可。

示例代码
代码语言:javascript复制

python
def decorator(func):
    def wrapper(*args, **kwargs):
        print("Function is being called")
        result = func(*args, **kwargs)
        print("Function has been called")
        return result
    return wrapper

@decorator
def say_hello(name):
    print(f"Hello, {name}")

say_hello("Alice")

在这个示例中:

  • decorator 是装饰器函数。
  • @decorator 应用于 say_hello 函数,使得 say_hello 被调用时,会先执行 decorator 中的 wrapper 函数逻辑。

装饰器的应用场景

日志记录

记录函数调用的相关信息,便于调试和监控。

代码语言:javascript复制

python
def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function {func.__name__} with arguments {args} and {kwargs}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} returned {result}")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a   b

add(3, 5)

权限验证

检查用户权限,控制函数访问。

代码语言:javascript复制

python
def authorize(func):
    def wrapper(user, *args, **kwargs):
        if user == "admin":
            return func(*args, **kwargs)
        else:
            print("Permission denied")
    return wrapper

@authorize
def view_dashboard():
    print("Dashboard is being viewed")

view_dashboard("admin")
view_dashboard("guest")

缓存机制

对函数结果进行缓存,提高性能。

代码语言:javascript复制

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

@cache
def fibonacci(n):
    if n in (0, 1):
        return n
    return fibonacci(n - 1)   fibonacci(n - 2)

print(fibonacci(10))

装饰器的嵌套使用

多个装饰器可以同时应用于一个函数,顺序从内到外执行。

示例代码
代码语言:javascript复制

python
def decorator1(func):
    def wrapper(*args, **kwargs):
        print("Decorator 1 before")
        result = func(*args, **kwargs)
        print("Decorator 1 after")
        return result
    return wrapper

def decorator2(func):
    def wrapper(*args, **kwargs):
        print("Decorator 2 before")
        result = func(*args, **kwargs)
        print("Decorator 2 after")
        return result
    return wrapper

@decorator1
@decorator2
def greet(name):
    print(f"Hello, {name}")

greet("Bob")

在这个示例中,decorator2 首先被应用,其次是 decorator1

结论

装饰器是Python中的一个强大功能,简化了许多常见的编程任务,如日志记录、权限控制、性能优化等。它使得代码更具可读性和可维护性,鼓励模块化和复用性。理解和熟练使用装饰器,可以大大提高开发效率和代码质量。

0 人点赞