Python装饰器使用方法详解

简介: 装饰器(Decorator)是 Python 中一种函数或类,用来修饰其他函数或类。装饰器可以改变被装饰函数的行为,或者在调用被装饰函数之前和之后增加额外的操作。装饰器的语法是使用 @ 语法符,在函数定义之前增加装饰器函数的名称

1 装饰器背景知识


1.1 基本概念

装饰器(Decorator)是 Python 中一种函数或类,用来修饰其他函数或类。装饰器可以改变被装饰函数的行为,或者在调用被装饰函数之前和之后增加额外的操作。装饰器的语法是使用 @ 语法符,在函数定义之前增加装饰器函数的名称。

@decorator_func
def my_func():
    pass

1.2 应用场景

代码重用:装饰器可以让我们在不更改原函数代码的情况下,为其添加额外的功能。


日志记录:装饰器可以记录函数的调用日志,帮助我们追踪程序的运行情况。


权限控制:装饰器可以用来实现函数级别的权限控制,只允许特定的用户访问特定的函数。


缓存:装饰器可以用来缓存函数的返回值,避免重复计算。


类型检查:装饰器可以用来在函数调用前检查参数的类型是否符合要求。


装饰器可以让你在函数或类的定义中添加额外的逻辑,而不更改它们的实现。


2 简单的装饰器代码


def decorator_func(func):
    def wrapper():
        print("Before calling the function")
        func()
        print("After calling the function")
    return wrapper
@decorator_func
def my_func():
    print("Inside the function")
my_func()
# Output: Before calling the function
#         Inside the function
#         After calling the function


上面展示了最简单的装饰器示例代码。在代码中,我们建立了一个名为decorator_func的装饰器和一个名为my_func函数。


装饰器外部的return必须为装饰器的内部函数,不含括号。通过代码结构可以看出,装饰器本身也是一个闭包。

在定义装饰器decorator_func时,括号中的’func’指代被装饰器装饰的函数,在这段代码中指代的就是my_func函数。

在被装饰器装时候,函数的实际执行执行顺序变成了内部函数wrapper所指定的顺序。即先执行print(“Before calling the function”);再执行func()指代的my_func函数;最后执行print(“After calling the function”)。

本段代码的最终输出为:Before calling the function;Inside the function;After calling the function

3 使用装饰器记录函数执行次数


def cal_times(func):
    l=[]
    def wrapper(*var):
        l.append('1')
        func(*var)
        print("函数执行了%s次"%(len(l)))
    return wrapper
@cal_times
def my_func(i):
    print('%s的平方是%s'%(i,i**2))
my_func(5)
my_func(6)


在my_func(i)函数中,我们增加了形参的输入,因此,在装饰器中,也要为之做出更改。此处装饰器中的wrapper函数我们使用*var传参,这种设计方式的优点是可以让这个装饰器适用于任何函数。

再加入了cal_times装饰器后,函数每运行一次,都会使列表l添加一个1,这样可以计算函数的运行次数。这段代码的运行结果如下:


dd4612e6bcb240e3b34c920c6f6400fa.png


4 带参数的装饰器


装饰器与函数一样,也可以带入参数,我们在第二节的基础上,对代码做出如下修改:


def decorator_func(param1, param2):
    def decorator(func):
        def wrapper():
            print("Before calling the function with params:", param1,param2)
            func()
            print("After calling the function")
        return wrapper
    return decorator
@decorator_func("hello", "world")
def my_func():
    print("Inside the function")
my_func()


这段代码使用了装饰器来在my_func函数调用前后打印额外的信息,并且装饰器函数decorator_func接受两个参数,在调用wrapper函数时使用这两个参数。

最终,代码将输出:Before calling the function with params: hello world; Inside the function;After calling the function。

如果同时还有字典类型的参数传入,可以使用(*var,**_var)进行解决


5 装饰器处理有返回值的函数


前面我们定义的函数都是执行某种功能,不涉及到return的相关操作。当涉及到处理有返回值的函数时,对于内部函数我们应该使用一个变量将函数的运行结果保存起来,并放在内层函数的return中。为了实现这一功能,我们将第三部分的代码做出如下修改:


def cal_times(func):
    l=[]
    def wrapper(*var):
        l.append('1')
        result = func(*var)
        print("函数执行了%s次"%(len(l)))
        return result
    return wrapper
@cal_times
def my_func(i):
    print('%s的平方是%s'%(i,i**2))
    return i**2
a = my_func(5)
b = my_func(6)
print(a,b)

对于这个装饰器,我们在内部函数wrapper使用result保存运行结果,并将result return,这样a与b就可以被正常的赋值,运行结果如下图。

4ca9f2ce0f3a45d4b1e1e0c2ee97712f.png

而如果不执行保存result并return,a和b将不会得到任何值:

a2343ab7c1ad498a92b2a8f559d1e2e6.png




相关文章
|
23天前
|
缓存 程序员 开发者
Python中的装饰器:提升代码灵活性与可维护性
在Python编程中,装饰器是一种强大的工具,它能够动态地修改或扩展函数或类的行为,从而提升代码的灵活性和可维护性。本文将深入探讨装饰器的工作原理、常见用法以及如何在项目中合理地应用装饰器,帮助开发者更好地理解和利用这一特性。
|
3天前
|
Python
Python中的装饰器:提升代码可读性与复用性
Python中的装饰器是一种强大的工具,能够提升代码的可读性和复用性。本文将深入探讨装饰器的原理、用法以及在实际项目中的应用,帮助读者更好地理解和利用这一特性,提升代码质量和开发效率。
|
4天前
|
监控 Python
Python中的装饰器:提升代码可读性与可维护性
Python中的装饰器是一种强大的工具,可以在不修改函数源代码的情况下,增加新的功能。本文将介绍装饰器的基本概念,以及如何使用装饰器来提升代码的可读性和可维护性。通过实例演示,读者将了解装饰器在各种场景下的灵活运用,从而更好地理解并应用于实际开发中。
|
4天前
|
缓存 Python
Python中的装饰器:提升代码可读性与灵活性
在Python编程中,装饰器是一种强大的工具,可以通过在函数或方法周围包装额外的功能来提升代码的可读性和灵活性。本文将深入探讨装饰器的概念、用法和实际应用,帮助读者更好地理解并运用这一Python编程的利器。
|
4天前
|
存储 Java 测试技术
Python中闭包和装饰器使用不当
【5月更文挑战第4天】Python中闭包和装饰器使用不当
11 1
|
4天前
|
存储 Java 测试技术
Python中闭包和装饰器使用不当Python中闭包和装饰器使用不当
【5月更文挑战第4天】Python中闭包和装饰器使用不当
7 2
|
6天前
|
Python
探索Python中的装饰器:提升代码灵活性与可维护性
Python中的装饰器是一种强大的工具,可以在不改变原有代码结构的情况下,动态地添加功能或修改函数的行为。本文将深入探讨装饰器的原理、常见用法以及如何利用装饰器提升代码的灵活性和可维护性。
|
6天前
|
缓存 测试技术 数据库
【Python 基础】什么是装饰器(decorator)?
【5月更文挑战第6天】【Python 基础】什么是装饰器(decorator)?
|
7天前
|
缓存 开发者 Python
《Python中的装饰器:优雅而强大的代码增强工具》
在现代软件开发中,Python语言的灵活性和简洁性备受推崇。其中,装饰器作为一种强大的代码增强工具,为Python开发者提供了优雅的解决方案。本文将深入探讨装饰器的原理、用法以及实际应用场景,帮助读者更好地理解和运用这一技术。
|
14天前
|
缓存 Python
Python 中的装饰器:提升代码可读性和灵活性的利器
装饰器是 Python 中一种强大的工具,它能够在不修改原有代码的情况下,增加新的功能和行为。本文将深入探讨装饰器的原理、用法以及在实际开发中的应用场景,帮助读者更好地理解并运用装饰器来提升代码的可读性和灵活性。