Python 装饰器理解

1、定义:

(1)装饰器指的是为被装饰对象添加额外功能的工具/函数。

2、使用装饰器的意义(原因):

如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时 候可以使用装饰器。因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能指的是开放的。

3、装饰器的实现必须遵循两大原则:

  1. 封闭: 对已经实现的功能代码块封闭。 不修改被装饰对象的源代码
  2. 开放: 对扩展开发 装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能。

4、如何实现装饰器?

装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

*******饰器的通用模板*******(很重要)

from functools import wrapsdef function(func): #func===被装饰的函数@wraps(func) #保留被装饰函数的名字和帮助文档def wrapper(*args, **kwargs): #形参,可变参数(元组),关键字参数(字典)"""被装饰函数前需要添加的内容"""result = func(*args, **kwargs) # 实参,解包"""被装饰函数后需要添加的内容"""return resultreturn wrapper

5、装饰器的应用场景:

装饰器经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、 权限校验等应用场景。

装饰器典型应用场景:

Django框架装饰器应用:http://y.tsutsumi.io/dry-principles-through-python-decorators.html

(1)插入日志

from functools import wraps# 定义装饰器
def logger(func):"""插入日志的装饰器"""@wraps(func)def wrapper(*args, **kwargs):print("函数%s开始执行" % (func.__name__))result = func(*args, **kwargs)print("函数%s执行结束" % (func.__name__))return resultreturn wrapper# 使用装饰器
@logger  # 语法糖 执行: login = logger(login) 将login通过logger函数进行装饰,返回wrapper
def login(username, password):if username == 'root' and password == '123':print('login ok')print('%s login ok' % (username))else:print('login failed')print('%s login failed' % (username))if __name__ == '__main__':login('root', '123')   # 实质执行的是wrapper函数
# ---- 运行结果-----
# 函数login开始执行
# login ok
# root login ok
# 函数login执行结束  

(2)性能测试

比如:计算代码运行时间

from functools import  wraps
import timedef timeit(func):   # 2   func=download_music"""打印被装饰函数运行总时间的装饰器"""# @wraps保留被装饰函数的函数名和帮助文档, 否则是wrapper的信息.@wraps(func)def wrapper(*args, **kwargs):   # 5     args=('Music', ), kwargs={}start_time = time.time()result = func(*args, **kwargs)  # 6 func('Music')=download_music('Music')end_time = time.time()print("%s函数运行总时间为%fs" %(func.__name__, end_time-start_time))return  result                  # 7return  wrapper     # 3@timeit         # 1 @timeit实质上执行的内容: download_music = timeit(download_music) = wrapper
def download_music(name):   # 7time.sleep(0.4)print('[Download]: ', name)return  True# 调用download_music函数时实质上调用的是wrapper函数。
download_music('Music') # 4

运行结果:

[Download]:  Music
download_music函数运行总时间为0.420078s

参考自https://blog.csdn.net/daidadeguaiguai/article/details/103672492

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是python标识符_Python:标识符Identifier

什么是标识符? 标识符 (ldentifier) :是一个用来标识变量、函数、类、模块或其他对象的名称。 标识符规范 1)标识符由字母、下划线和数字组成 2)不能以数字开头 3)区分大小写 4)不能使用关键字 命名规则 1、见名知意。…

Python 可变参数*args和**kwargs

多个实参,放到一个元组里面,以*开头,可以传多个参数;**是形参中按照关键字传值把多余的传值以字典的方式呈现 *args:表示的就是将实参中按照位置传值,多出来的值都给args,且以元组的方式呈现, …

springboot security 权限校验_十二、SpringBoot 优雅的集成Spring Security

前言至于什么是Spring security ,主要两个作用,用户认证和授权。即我们常说的,用户只有登录了才能进行其他操作,没有登录的话就重定向到登录界面。有的用户有权限执行某一操作,而有的用户不能执行则是授权。算是一个项…

python模块下载过程_常用的python模块及安装方法

bsddb3:BerkeleyDB的连接组件 Cheetah-1.0:我比较喜欢这个版本的cheetah cherrypy:一个WEB framework ctypes:用来调用动态链接库 DBUtils:数据库连接池 django:一个WEB framework docutils:用来…

python3 week4

1 实现四舍五入,禁止使用python内建函数。 func(soure_num, precise),source_num为需要处理的数据,precise为需要保留的位数 """ File: 01四舍五入.py Author: chde_wang Date: 2020-08-09 12:14:59 D…

python如何读取csv文件某几行某几列_关于python:读取.csv文件时,我似乎无法指定列dtypes...

本问题已经有最佳答案,请猛点这里访问。 一个菜鸟问题(修订):我读了一个.csv文件,并尝试按以下方式指定dtypes: 1 2 3 4 5 6 7 8 9 10 11 12 13 14import csv import pandas as pd cdc pd.read_csv(myFile.csv, dtype { Phenoty…

python-week5

1、现在有如下流程:A->B->C->D->E->F,要求根据输入的参数从制定的流程执行下去 """ File: 01流程执行.py Author: chde_wang Date: 2020-08-16 18:51:35 Description:将输入存储到列表中&#xf…

python-week6

1.如下示例, 请用面向对象的形式优化以下代码 def exc1(host,port,db,charset):connconnect(host,port,db,charset)conn.execute(sql)return xxxdef exc2(host,port,db,charset,proc_name)connconnect(host,port,db,charset)conn.call_proc(sql)return xxx # 每次调用都需要重复…

python定义空数组_在numpy数组中设置空值

如何根据条件使numpy数组中的某些值为空? 我不明白为什么我最终得到的是0,而不是不满足条件的null或空值。。。b是用0和1值填充的numpy数组,c是另一个完全填充的numpy数组。所有阵列均为71x71x166a np.empty(((71,71,166))) d np.empty(((7…

excel学习1-查看一列数值是否在另一列中存在

出现次数用COUNTIF 是否出现使用 IFCOUNTIF 加入$的作用是将需要比对的列固定范围。写好一个函数后,使用右下角号,直接下拉就可以。 参考自https://blog.csdn.net/gywtzh0889/article/details/72910377

fx5u以太网通讯设置_操作示例 | 实现S7300和FX5U的数据交换

北辰BCNet-S7300Plus(以下简称BCNet),在BCNet-S7300的基础上,以太网口增加了支持与西门子带网口PLC(S7-200SMART 、S7-1200、S7-1500、S7300PN)之间的通讯功能。这些通讯功能包括基于S7TCP协议的数据交换、ModbusTCP服务器功能、ModbusTCP客户机功能&…

excel基础-固定某一列的输入内容

Office:需要固定的单元格-点击数据-数据有效性-点击,选择有效性条件 允许为:序列,然后需要下拉框内容,并选择下拉框。即可 切记:开源中的逗号为英文逗号。 最后效果如下: 参考自https://jingya…

为什么多个线程不可能同时抢到一把锁_HFL Redis_12_redis分布式锁的3种实现方式...

HotFrameLearning(简称 HFL) Redis_12_redis分布式锁的3种实现方式-一、大致介绍1、昨天介绍完redis的数据结构后,有小伙伴让本人讲讲redis的分布式锁,因此才有了此篇的由来,只是把我的节奏提前了而已;2、接下来我就通过几种方式介…

linux下mysql5.7修改密码

开始修改MySQL用户密码 ① 输入use mysql回车; ② 输入update user set password password(“147258”)where user’root’; “147258”为你自己设置的密码; 执行第二步后如果报错: 执行后报错  ERROR 1…

react项目中的参数解构_重构复杂的React组件:编写高效且可读组件的5个最佳实践...

随着 React.js 的不断进化,现在的它已经成为 Web 组件中最受欢迎的视图库之一。但是你手中的它,是否真的能够正常工作呢?本文将主要描述 5 个关于React 组件的最佳实践,希望对正在关注 React 组件的你有所帮助。我自己是一名从事了…

robotFramework-ride使用1-关键字驱动与数据类型

RF项目结构 项目文件夹(new project) 用例集(test suit) 测试用例(test case) RF基本功能-设置区介绍 项目 --》settings----》Document:添加用例说明 suit setup:执行此测试套件…

opencv threshold_基于深度学习OpenCV与python进行字符识别

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达当我们在处理图像数据集时,总是会想有没有什么办法以简单的文本格式检索图像中的这些字符呢?今天我们就一起看看有没有什么简单的办法可以实现这一…

python3 robotframework+pycharm框架搭建

1.安装python3 框架组成:自动化基础库(robotframework)图形界面(robotframework-ride) 2.安装RF框架 安装robotframework。pip install robotframework -i https://pypi.doubanio.com/simple 安装robotframework-r…

delphi if多个条件_判断(if)语句

判断(if)语句目标开发中的应用场景if 语句体验if 语句进阶综合应用01. 开发中的应用场景生活中的判断几乎是无所不在的,我们每天都在做各种各样的选择,如果这样?如果那样?……程序中的判断if 今天发工资: ​…

excel sheet限制_Python 处理Excel内的数据(案例介绍*3)

点击上方“蓝字”关注我们了解更多精彩案例一介绍现在有一批电商产品跟当日销量的数据,如下,总共有上万笔的数据,现在需要统计每个品牌当日的销售量,比如美宝莲今天总共卖出了多少的商品,另外需要统计每个品牌下面的每…