Python装饰器使用方法全面梳理

 更新时间:2023年01月28日 10:01:55   作者:专注算法的马里奥学长  
这篇文章主要介绍了Python @property装饰器的用法,在Python中,可以通过@property装饰器将一个方法转换为属性,从而实现用于计算的属性,下面文章围绕主题展开更多相关详情,感兴趣的小伙伴可以参考一下

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,这样可以计算函数的运行次数。这段代码的运行结果如下:

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就可以被正常的赋值,运行结果如下图。

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

到此这篇关于Python装饰器使用方法全面梳理的文章就介绍到这了,更多相关Python装饰器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python从入门到精通之Hash函数的使用详解

    Python从入门到精通之Hash函数的使用详解

    Python提供了强大而灵活的Hash函数,用于在各种应用中实现数据存储、数据校验、加密等功能,下面将从入门到精通介绍Python中Hash函数的使用,感兴趣的可以了解一下
    2023-08-08
  • python 地图经纬度转换、纠偏的实例代码

    python 地图经纬度转换、纠偏的实例代码

    这篇文章主要介绍了python 地图经纬度转换、纠偏的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • Pytorch实现LSTM和GRU示例

    Pytorch实现LSTM和GRU示例

    今天小编就为大家分享一篇Pytorch实现LSTM和GRU示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • PyQt5中QPushButton的用法详细解析与应用实战

    PyQt5中QPushButton的用法详细解析与应用实战

    PyQt5 是一个用于创建图形用户界面的 Python 绑定库,它基于 Qt5 应用程序框架,在 PyQt5 中,QPushButton 是一个常用的控件,用于创建按钮,允许用户通过点击来触发某些操作,本文将详细介绍 QPushButton 的用法,并通过实际案例来展示其强大的功能
    2024-07-07
  • 基于python读取图像的几种方式汇总

    基于python读取图像的几种方式汇总

    Python进行图片处理,第一步就是读取图片,下面这篇文章主要给大家介绍了关于基于python读取图像的几种方式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • python实现简单日期工具类

    python实现简单日期工具类

    这篇文章主要为大家详细介绍了python实现简单日期工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Python3操作MongoDB增册改查等方法详解

    Python3操作MongoDB增册改查等方法详解

    这篇文章主要介绍了Python操作MongoDB增册改查等方法详解,需要的朋友可以参考下
    2020-02-02
  • Python 使用list和tuple+条件判断详解

    Python 使用list和tuple+条件判断详解

    这篇文章主要介绍了Python 使用list和tuple+条件判断详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Pycharm搭建Django项目详细教程(看完这一篇就够了)

    Pycharm搭建Django项目详细教程(看完这一篇就够了)

    这篇文章主要给大家介绍了关于Pycharm搭建Django项目的详细教程,想要学习的小伙伴看完这一篇就够了,pycharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,需要的朋友可以参考下
    2023-11-11
  • Python 寻找局部最高点的实现

    Python 寻找局部最高点的实现

    今天小编就为大家分享一篇Python 寻找局部最高点的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12

最新评论