简单了解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的列表中利用remove()方法删除元素的教程
May 21 Python
让Python代码更快运行的5种方法
Jun 21 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
详解字符串在Python内部是如何省内存的
Feb 03 Python
Python递归函数特点及原理解析
Mar 04 Python
完美解决jupyter由于无法import新包的问题
May 26 Python
如何用Python徒手写线性回归
Jan 25 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 Python
Python采集壁纸并实现炫轮播
Apr 30 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 函数中使用static的说明
2012/06/01 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
php实现求相对时间函数
2015/06/15 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
swoole锁的机制代码实例讲解
2021/03/04 PHP
jquery.validate使用攻略 第二部
2010/07/01 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
Javascript非构造函数的继承
2015/04/27 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
原生JS实现旋转木马式图片轮播插件
2016/04/25 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
EsLint入门学习教程
2017/02/17 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
用python读写excel的方法
2014/11/18 Python
基于Python实现文件大小输出
2016/01/11 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
土木工程师岗位职责
2013/11/24 职场文书
电台实习生求职信
2014/02/25 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
2014年采购工作总结
2014/11/20 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android