我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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装饰器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍了Python@property装饰器的用法,在Python中,可以通过@property装饰器将一个方法转换为属性,从而实现用于计算的属性,下面文章围绕主题展开更多相关详情,感兴趣的小伙伴可以参考一下
2023-01-28

使用Python装饰器方法是什么

本篇内容主要讲解“使用Python装饰器方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用Python装饰器方法是什么”吧!今天才发现装饰器的另一种用法,下面就先上代码:data_li
2023-06-16

python中property装饰器的使用方法

这篇文章主要介绍python中property装饰器的使用方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整型)、long(长整型)
2023-06-15

Python装饰器的介绍及使用方法

本篇内容主要讲解“Python装饰器的介绍及使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python装饰器的介绍及使用方法”吧!app = Flask(__name__) @app.r
2023-06-17

Python装饰器的使用方法有哪些

这篇文章主要介绍了Python装饰器的使用方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python装饰器的使用方法有哪些文章都会有所收获,下面我们一起来看看吧。装饰器的价值不言而喻,可以用来增强函数
2023-07-02

Python装饰器的使用方法是什么

本篇内容主要讲解“Python装饰器的使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python装饰器的使用方法是什么”吧!1. 什么是装饰器对于受到封装的原函数比如f来说,装饰器
2023-06-16

对Python装饰器的个人理解方法

0.说明                 在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快
2023-01-31

Python装饰器的定义和使用方法是什么

本篇内容主要讲解“Python装饰器的定义和使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python装饰器的定义和使用方法是什么”吧!1.装饰器的定义装饰器:给已有函数增加额外的
2023-06-30

12步入门Python中的decorator装饰器使用方法

装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。相对于其它方式,装饰器
2022-06-04

Python面向切面编程AOP及装饰器怎么使用

本篇内容主要讲解“Python面向切面编程AOP及装饰器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python面向切面编程AOP及装饰器怎么使用”吧!什么是 AOPAOP,就是面向切
2023-06-30

深入理解Python中装饰器的用法

因为函数或类都是对象,它们也能被四处传递。它们又是可变对象,可以被更改。在函数或类对象创建后但绑定到名字前更改之的行为为装饰(decorator)。 “装饰器”后隐藏了两种意思——一是函数起了装饰作用,例如,执行真正的工作,另一个是依附于装
2022-06-04

Python中如何理解和使用装饰器 @decorator

Python中如何理解和使用装饰器 @decorator,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python的装饰器(decorator)是一个很棒的机制
2023-06-02

Python黑魔法@property装饰器的使用技巧解析

@property有什么用呢表面看来,就是将一个方法用属性的方式来访问. 上代码,代码最清晰了.class Circle(object): def __init__(self, radius): self.radius = radius @
2022-06-04

Python中的装饰器和上下文管理器的原理和使用场景是什么?

Python中的装饰器和上下文管理器是两个非常有用的特性,它们可以帮助我们更好地组织和管理代码,并提高代码的可复用性。本文将分别介绍装饰器和上下文管理器的原理和使用场景,并给出具体的代码示例。一、装饰器的原理和使用场景原理:装饰器是一种在不
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录