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

函数的高级用法之装饰器:Python @decorator的使用

发布时间:2023-08-22 10:53:36

装饰器是Python中一种非常有用的高级编程技巧,它可以动态地修改类或者函数的行为,扩展其功能。装饰器是一个函数,它接受一个函数作为参数,并返回一个新的函数。

在Python中,使用@符号可以很方便地应用装饰器,@符号后面紧跟着装饰器函数的名称,放在被装饰的函数(或者类)的定义之前。装饰器函数会在被装饰的函数定义完成后立即执行,其返回的新函数会替代原来的函数。

下面我们来看一个简单的示例,实现一个计时器的装饰器函数:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__}函数执行耗时:{end_time - start_time}秒")
        return result
    return wrapper

@timer
def my_function():
    time.sleep(2)
    print("执行了my_function")

my_function()

在这个示例中,我们定义了一个装饰器函数timer,它接受一个函数作为参数,返回一个新的函数wrapper。新函数wrapper在执行被装饰的函数之前和之后都会打印执行耗时的信息。

通过在my_function函数的定义前使用@timer装饰器,相当于使用timer函数对my_function进行了装饰。当我们调用my_function时,实际上会执行timer(wrapper)函数,返回一个新的经过装饰的函数。这个新函数会在执行my_function之前和之后打印执行耗时的信息。

装饰器的使用大大简化了函数的调用,使得我们可以在不修改原函数定义的情况下,动态地扩展其功能。

下面我们再来看一个更复杂一些的示例,实现一个检查用户权限的装饰器函数:

def check_permission(permission):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if check_user_permission(permission):
                return func(*args, **kwargs)
            else:
                raise PermissionError("没有权限")
        return wrapper
    return decorator

def check_user_permission(permission):
    # 模拟检查用户权限的过程,这里假设用户拥有所有权限
    return True

@check_permission("admin")
def my_function():
    print("执行了my_function")

my_function()

在这个示例中,我们定义了一个装饰器函数check_permission,它接受一个参数permission,并返回一个新的装饰器函数decorator。decorator函数接受一个函数作为参数,返回一个新的包装函数wrapper。

在wrapper函数中,我们通过调用check_user_permission函数来检查用户是否拥有指定的权限。如果拥有权限,就执行被装饰的函数func,并返回结果;如果没有权限,就抛出PermissionError异常。

通过在my_function函数的定义前使用@check_permission("admin")装饰器,相当于使用check_permission("admin")(my_function)函数对my_function进行了装饰。装饰器函数check_permission("admin")返回的是一个装饰器函数decorator,再调用decorator(my_function)返回一个新的经过装饰的函数。这个新函数在执行之前会先检查用户权限。

装饰器的应用非常广泛,可以用于日志记录、性能测试、权限验证等方面。它可以让代码更加简洁、易读,提高代码的复用性。同时,装饰器也能够使得我们在不改变原函数的前提下,动态地在函数的周围添加额外的功能。