首页 > 编程语言 >【python装饰器:参数,顺序,场景】

【python装饰器:参数,顺序,场景】

时间:2023-02-05 17:00:12浏览次数:37  
标签:场景 函数 python 代码 顺序 可以 执行 装饰

一、装饰器是什么?

装饰器,顾名思义,就是增强函数或类的功能的一个函数。

作用:在不修改功能代码的同时,给代码扩展新的功能,可以装饰函数,也可以装饰类。
举个例子:如何计算函数的执行时间?
如下,计算 add 函数的执行时间。​​​​​​​

【python装饰器:参数,顺序,场景】_调用函数

又假如,新的需求让你计算减法函数(sub)的时间。不用装饰器的话,我们又得重复写一段减法的代码。

【python装饰器:参数,顺序,场景】_调用函数_02

两段代码,其中实现计算函数执行时间的逻辑是完全一样的,按照如上写法,维护困难且难以拓展,要改动的话所有地方都要改动,要拓展到其他函数的话,其他函数也要加上这段逻辑,我们可以将之提取出来,单独实现一个计算函数执行时间的函数,在需要的时候以合适的方式调用,这一类可以对所有函数拓展新功能的函数,就可以称之为装饰器。

使用装饰器之后的代码是这样的

【python装饰器:参数,顺序,场景】_语法糖_03

使用装饰器实现共同需要的功能,可以大大简化我们的代码。

定义装饰器

【python装饰器:参数,顺序,场景】_调用函数_04

二、使用装饰器

假设decorator是定义好的装饰器。
使用装饰器有两种方法

方法一:不用语法糖@符号​​​​​​​

【python装饰器:参数,顺序,场景】_调用函数_05

方法二:采用语法糖@符号​​​​​​​

【python装饰器:参数,顺序,场景】_语法糖_06

三、装饰器参数

装饰器可以传参,也可以不用传参。
1、自身不传入参数的装饰器(采用两层函数定义装饰器)

【python装饰器:参数,顺序,场景】_执行时间_07

自身传入参数的装饰器(采用三层函数定义装饰器)

【python装饰器:参数,顺序,场景】_语法糖_08

四、多个装饰器顺序

1、装饰的顺序(不调用函数)

【python装饰器:参数,顺序,场景】_调用函数_09

可以看出,装饰的顺序为由下往上

2、装饰器执行的顺序(调用函数)

【python装饰器:参数,顺序,场景】_语法糖_10

装饰器执行的顺序与装饰的顺序相反,先执行后装饰的装饰器函数,在调用原函数时再进入并执行先装饰的装饰器函数,然后退出当前装饰器函数,再退出外层的装饰器函数

3、常见应用场景

在实际应用的场景中,当我们采用上面的方式写了两个装饰方法比如先验证有没有登录 @login_required , 再验证权限够不够时 @permision_allowed 时,我们采用下面的顺序来装饰函数:

【python装饰器:参数,顺序,场景】_执行时间_11

总结:多个装饰器装饰函数时,从下到上包裹(装饰)函数,从上到下执行。


标签:场景,函数,python,代码,顺序,可以,执行,装饰
From: https://blog.51cto.com/u_15874356/6038315

相关文章

  • python-conftest、fixture、matefunc介绍
    pytest的规则使用"""使用pytest编写用例,必须遵守以下规则:(1)测试文件名必须以“test_”开头或者"_test"结尾(如:test_ab.py)(2)测试类命名以"Test"开头。(3......
  • python接口自动化-logging日志
    logging模块的日志级别:日志级别一共有5个从低到高如下,作用是在当你给python函数赋予日志器时,需要自己标记日志级别(后面会用到)DEBUG(调试级别):严重程度最低级别,详细程度最......
  • RBMQ中python案例一:简单模式
    一、生产者与消费者模式之简单模式,原理图   二、生产者产生消息importjsonimportpikaimportdatetime#生产者producer.pydefget_message():#......
  • python-pytest.ini介绍
    一、pytest.ini执行方式含义[pytest]addopts=-vsq--html=./report.htmltestpaths=./testConftestpython_files=test*.pypython_classes=Test*python_func......
  • Mac-pycharm执行python3 manage.py makemigrations报错处理
    Mac-pycharm执行python3manage.pymakemigrations报错处理1报错:NameError:name'_mysql'isnotdefined参考:https://blog.csdn.net/weixin_35757704/article/detail......
  • Python黑客编程之tcp代理
    目的写一款socket代理工具,其实就是在原来两极通信中再加一极,中间极用来转发socket的流量,可以在中间层面实现流量的拦截和篡改代码代理importsocketimportsysim......
  • python collection Chainmap Counter
    chainmap是一个方便的工具类。它是使用链的方式将多个dict链在一起,并不是真正的生成一个新的dict,从而允许程序可以这获取任意一个dict所包含的所有key对应的value。但是......
  • 整理我遇到的 Python 的疑难问题
    1如果字典里一个键指向一个实例,深拷贝会拷贝出一个新的实例吗?不会:classfoo:def__init__(self):print('doinitfoo')a={'cls':foo()}a#......
  • python 3.python入门
    1.编程语言介绍1.1分类机器语言#机器语言用二进制代码0和1描述的指令称为机器指令,由于计算机内部是基于二进制指令工作的,所以机器语言是直接控制计算......
  • python Listbox插入数据导致GUI崩溃
    提问: 我用windnd模块做了个文件拖入获取路径的功能,想把获取到的路径插入到列表,但是GUI会崩溃,下面是原代码求帮忙看看咋回事importwindndimportthreadingimporttk......