装修器(Decorators)是Python中一种强壮的编程工具,它允许您在不修改被装修函数源代码的情况下,添加、修改或扩展函数的功用。装修器本质上是一个函数,它承受一个函数作为输入,并回来一个新的函数。装修器在实践开发中常用于代码重用、日志记载、性能分析、权限查看等方面。

下面是一个装修器的根本结构

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 添加装修逻辑
        result = original_function(*args, **kwargs)
        # 回来被装修函数的成果
        return result
    return wrapper_function

接下来我会举三个来进一步带你们了解Python装修器的用法,信任会对你们有所协助(此处应该有掌声)

第一个:

计时装修器

这个装修器能够用来核算函数的履行时间,比方在对一些函数做性能分析时,往往需求统计履行时间,有了装修器咱们就不需求写重复代码了,只需求给需求核算履行时间的办法加上装修器即可。

# 这个装修器能够用来核算函数的履行时间。
import time
# 这儿是装修器的界说
def timing_decorator(original_function):
    def wrapper_function(*args, **kwargs):
        start_time = time.time()
        result = original_function(*args, **kwargs)
        end_time = time.time()
        print(f"函数{original_function.__name__}履行运用了{end_time - start_time}秒")
        return result
    return wrapper_function
# @后面跟着的办法就是咱们界说的装修器了
@timing_decorator
def slow_function():
    time.sleep(2)
#这儿调用了slow_function(),会输出办法所用时间
slow_function()

运转成果如下:

3分钟带你了解Python装饰器(Decorators)离成为大佬又近了一步

第二个:

权限检验装修器

这个装修器能够用来查看用户是否有满足的权限履行某个操作。示例装修器有1个入参,输入的是用户人物,比方只有人物是admin和root的才有对办法do_something()有操作的权限。

# 这个装修器能够用来查看用户是否有满足的权限履行某个操作。
def permission_required(permission):
    def decorator(original_function):
        def wrapper_function(*args, **kwargs):
            if has_permission(permission):
                return original_function(*args, **kwargs)
            else:
                # 装修器内部运用了 raise 关键字来抛出反常,以便在特定条件下阻止函数继续履行。
                raise PermissionError("没有操作权限") 
        return wrapper_function
    return decorator
def has_permission(user_role):
    user_roles = ['admin','root']
    if user_role in user_roles:
        return True
    else:
        return False
@permission_required("admin111")
def do_something(resource_id):
    # 有权限操作
    print(f"您有操作【{resource_id}】 的权限")
do_something('查看用户交易记载')

运转成果如下: 当@permission_required("admin111")的入参是admin111时输出成果如下:

3分钟带你了解Python装饰器(Decorators)离成为大佬又近了一步

@permission_required("admin")的入参是admin时输出成果如下:

3分钟带你了解Python装饰器(Decorators)离成为大佬又近了一步

第三个:

日志装修器

这个装修器能够用来记载函数的调用和参数。

# 这个装修器能够用来记载函数的调用和参数。
def log_arguments(original_function):
    def wrapper_function(*args, **kwargs):
        print(f"调用了:{original_function.__name__}办法,传入的args为: {args}传入的kwargs为: {kwargs}")
        result = original_function(*args, **kwargs)
        return result
    return wrapper_function
@log_arguments
def add(a, b):
    return a + b
result = add(3, 5)

运转成果如下:

3分钟带你了解Python装饰器(Decorators)离成为大佬又近了一步


备注

raise 是Python中用于引发反常的关键字。当您在代码中运用 raise 关键字时,您实践上是在抛出一个反常,从而指示程序呈现了错误或反常情况。

在上述示例中,装修器内部运用了 raise 关键字来抛出反常,以便在特定条件下阻止函数继续履行。