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

Python装饰器:增强现有函数功能

发布时间:2023-06-26 11:57:02

Python装饰器是一种使得现有函数增强,而不需要对函数的原有代码进行修改的语法结构。它们允许您在运行时更改或增加代码的行为,比如在一个函数的执行前后添加一些逻辑或在函数执行时对其参数进行修改,以改变函数的行为或添加额外的功能。

使用Python装饰器可以使得代码更加简洁,更加可读,也可以减少代码的冗余程度。以下是一些Python装饰器常见的应用场景:

1. 记录日志:使用装饰器记录函数执行信息并将其输出到日志中,以便调试和查错。

def log(func):
    def wrapper(*args, **kwargs):
        print(f"Called function: {func.__name__} with args:{args}, kwargs:{kwargs}")
        return func(*args, **kwargs)
    return wrapper
    
@log
def foo():
    print("hello world")

foo()
# Output: Called function: foo with args:(), kwargs:{}
#         hello world

2. 计时器:使用装饰器实现一个简单的计时器函数,记录函数执行所需的时间。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        elapsed = time.time() - start
        print(f"{func.__name__} took {elapsed}s")
        return result
    return wrapper

@timer
def foo():
    time.sleep(2)
    print('hello world')

foo()
# Output: hello world
#         foo took 2.000042200088501s

3. 权限检查:使用装饰器检查用户权限,并在没有权限时抛出异常。

def has_permission(user):
    if user == "admin":
        return True
    else:
        raise Exception("User does not have permission")

def check_permisson(func):
    def wrapper(user):
        if has_permission(user):
            return func(user)
    return wrapper

@check_permisson
def foo(user):
    print(f"{user} has permission to access this resource")

foo("admin")
# Output: admin has permission to access this resource

foo("guest")
# Output: (no output)

通过上述示例,我们可以看到Python装饰器的应用非常灵活,又非常直观。通过使用Python装饰器,我们可以简化代码,增强功能,减少冗余,这会提高代码的可复用性以及可维护性。 它们被广泛应用于许多Python框架和模块之中,如Django、Flask、Pyramid等等,也已成为Python开发者不可或缺的技能之一。