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

Python函数的装饰器:增强函数功能和调用方式

发布时间:2023-10-27 14:11:10

Python中的装饰器是一种特殊的函数,用于增强其他函数的功能和调用方式。装饰器可以在不修改原函数代码的情况下,为函数提供额外的功能。

装饰器的使用方式如下:

@装饰器函数
def 原函数():
    pass

装饰器函数是一个接受一个函数作为参数并返回一个新函数的函数。装饰器函数可以在原函数的调用前后执行额外的操作,比如打印日志、计时等。

装饰器的使用可以大大简化代码,提高代码的可读性和可维护性。下面我们介绍几个常见的装饰器用法。

1. 打印日志

装饰器可以用于在函数调用前后打印日志信息,方便调试和排查问题。下面是一个简单的打印日志的装饰器示例:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Finished {func.__name__}")
        return result
    return wrapper

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

print(add(2, 3))

运行结果如下:

Calling add
Finished add
5

2. 计时器

装饰器可以用于计算函数的执行时间,方便性能优化和代码的性能评估。下面是一个简单的计时器装饰器示例:

import time

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

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

print(fibonacci(10))

运行结果如下:

fibonacci executed in 0.0041196346282958984 seconds
55

3. 权限验证

装饰器可以用于验证用户的权限,限制只有具有特定权限的用户才能访问某些函数。下面是一个简单的权限验证的装饰器示例:

def allowed_users_decorator(func):
    def wrapper(user, *args, **kwargs):
        if user.is_authenticated():
            return func(user, *args, **kwargs)
        else:
            raise PermissionError("Permission denied")
    return wrapper

@allowed_users_decorator
def view_profile(user):
    print(f"Viewing profile of {user.username}")

user = User(username="Alice", is_authenticated=True)
view_profile(user)

运行结果如下:

Viewing profile of Alice

装饰器是Python中一种强大而灵活的机制,通过装饰器可以在不修改原函数代码的情况下,为函数提供额外的功能和调用方式。通过合理的使用装饰器,可以提高代码的可读性、可维护性和性能。