简单了解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基类函数的重载与调用实例分析
Jan 12 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
python实现txt文件格式转换为arff格式
May 31 Python
Python实现的建造者模式示例
Aug 06 Python
对Python 内建函数和保留字详解
Oct 15 Python
Pycharm 设置默认头的图文教程
Jan 17 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
python unittest单元测试的步骤分析
Aug 02 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代码包装修正版
2008/03/15 PHP
PHP 数字左侧自动补0
2008/03/31 PHP
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
php抓取页面的几种方法详解
2013/06/17 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python中str is not callable问题详解及解决办法
2017/02/10 Python
详解Python中where()函数的用法
2018/03/27 Python
Python读取多列数据以及用matplotlib制作图表方法实例
2020/09/23 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
高清屏下canvas重置尺寸引发的问题的解决
2019/10/14 HTML / CSS
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
世界上最好的帽子:Tilley
2016/11/27 全球购物
大学生求职简历的自我评价
2013/10/21 职场文书
医学院护理专业应届生求职信
2013/11/12 职场文书
土木工程师岗位职责
2013/11/24 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
2014道德模范事迹材料
2014/02/16 职场文书
大学新学期计划书
2014/04/28 职场文书
入党积极分子评语
2014/05/04 职场文书
CAD实训总结范文
2015/08/03 职场文书