简单了解python装饰器原理及使用方法


Posted in Python onDecember 18, 2019

这篇文章主要介绍了简单了解python装饰器原理及使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖。

装饰器的使用方法很固定:

先定义一个装饰函数(帽子)(也可以用类、偏函数实现)

再定义你的业务函数、或者类(人)最后把这顶帽子带在这个人头上

Python装饰器就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。

这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌“原“”函数的函数。

# 有两个已经实现的方法
def f1():
  print("正常流程1")
def f2():
  print("正常流程2")

# 一、需求 我们在每个方法内部加入一个需求
# 定义了一个函数f3,它的参数是一个函数,然后给这个函数嵌入print("需求")。但是想要拓展这一千万个函数功能,
# 就是要执行一千万次f3()函数,所以这样并不理想!接下来,我们可以试着用装饰器来实现,先看看装饰器最原始的面貌。
def f3():
  print("需求")

def f1():
  f3()
  print("正常流程1")

def f2():
  f3()
  print("正常流程2")
# 二、需求 我们现在不需要之前的那个需求了 需要删除f3()

def f1():
  print("正常流程1")

def f2():
  print("正常流程2")

# 根据 python开放-封闭的原则,有些时候核心代码并不可以直接去改,所以在不改动原代码的情况下,我们可以再定义一个函数
# 这里的f3函数就是最原始的装饰器,它的参数是一个函数,然后返回值也是一个函数。
#
# 其中作为参数的这个函数f1()就在返回函数f4()的内部执行。然后在函数f1()前面加上@f3,
#
# f1()函数就相当于注入增加“需求”功能,现在只要调用f1(),它就已经变身为增加“需求”的函数了,
# (不需要重复执行原函数)。
def f3(fn):
def f4():


print("需求")
   fn()
  return f4

@f3
def f1():
  print("正常流程1")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用in操作符时元组和数组的区别分析
May 19 Python
Python中格式化format()方法详解
Apr 01 Python
python操作xlsx文件的包openpyxl实例
May 03 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
python批量创建指定名称的文件夹
Mar 21 Python
python3 map函数和filter函数详解
Aug 26 Python
python+Selenium自动化测试——输入,点击操作
Mar 06 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
如何验证python安装成功
Jul 06 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
django学习之ajax post传参的2种格式实例
May 14 Python
修改Pandas的行或列的名字(重命名)
Dec 18 #Python
Python3直接爬取图片URL并保存示例
Dec 18 #Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 #Python
Python谱减法语音降噪实例
Dec 18 #Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 #Python
使用python 对验证码图片进行降噪处理
Dec 18 #Python
如何使用Python多线程测试并发漏洞
Dec 18 #Python
You might like
PHP下escape解码函数的实现方法
2010/08/08 PHP
Destoon实现多表查询示例
2014/08/21 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
微信小程序 引入es6 promise
2017/04/12 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
浅析Visual Studio Code断点调试Vue
2018/02/27 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
Python格式化压缩后的JS文件的方法
2015/03/05 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
python 实现单例模式的5种方法
2020/09/23 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
土木工程个人自荐信范文
2013/11/30 职场文书
中专自我鉴定
2014/02/05 职场文书
乔迁之喜主持词
2014/03/27 职场文书
2016年寒假见闻
2015/10/10 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书