一、装饰器定义

装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短。

应用场景:

假如:此时写了很多函数,有一个新的需求需要在多个函数中添加或者修改一个功能,如果每个函数都修改一次显得太过繁重,此时装饰器就出现了。

首先定义一个装饰器,写好要修改或者添加的功能,每个函数前用@装饰器名称,即可调用装饰器函数。

定义一个装饰器:

def outer(func):def inner():print ("start")r = func() # r = Noneprint  ("end")return rreturn inner # 注意:返回的只是函数名,不是inner()

定义一个函数,并引用装饰器:

@outer  # 引用装饰器
def faa():print ("faa")a = faa()
print (a)

查看执行结果

start
faa
end

从执行结果我们可以看出装饰器的执行顺序,先执行装饰器的部分功能,再执行普通方法中,然后执行装饰器其它代码,顺序可以根据需求调整。

@作用:

  • 执行outer函数,并将@下面的函数名传给outer函数,当做参数。
  • 将outer函数的返回值重新赋值给faa faa=outter的返回值
  • 本质上:相当于在原来的函数faa的基础上,前后增加了一些操作。将原函数封装到另外一个函数上,并将返回值重新赋值给原函数

二、装饰器加参数。

装饰器内部调用函数时,假如函数需要传参,那么以上代码无法满足传参的需求。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def outer(func):def inner(a1,a2):print ("==== start =====")r = func(a1,a2)print ("==== end ====")return rreturn inner@outer
def faa(a1,a2):print ("普通函数中的功能")# ============= 执行结果 ================
ret = faa("a","b")
print (ret)

以上代码即可实现传参功能。

但是我们会发现这样传参很不灵活,既假如还有其它函数需要传参,而传参的个数或者参数的类型不一样,那么以上代码则无法满足其它函数传参。

三、装饰器传多个参数

普通函数传多个参数:

def fun(*args,**kwargs):print (args)print (kwargs)fun("a1","a2",k1="steven",k2="18")# ============= 返回结果 ==============
('a1', 'a2')
{'k2': '18', 'k1': 'steven'}

装饰器传参

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def outer(func):def inner(*args,**kwargs):print  ("=" * 20)print ("装饰器 start")r = func(*args,**kwargs)print ("装饰器,end")return rreturn inner@outer
def fun1(a1):print ("fun1 一个参数")@outer
def fun2(a1,a2):print ("fun2 两个参数")@outer
def fun3(*args,**kwargs):print (args)print (kwargs)ret1 = fun1("f1_a1")
ret2 = fun2("f2_a1","f2_a2")
ret3 = fun3("f3_a1","f3_a3",k1="k1",k2="k2")#返回结果
====================
装饰器 start
fun1 一个参数
装饰器,end
====================
装饰器 start
fun2 两个参数
装饰器,end
====================
装饰器 start
('f3_a1', 'f3_a3')
{'k1': 'k1', 'k2': 'k2'}
装饰器,end

四、添加多个装饰器

def outer(func):def inner(*args,**kwargs):print ("="*20)print ("装饰器outer start")r = func(*args,**kwargs)print ("装饰器outer end")return rreturn innerdef outer_1(func):def inner(*args,**kwargs):print ('='*20)print ("装饰器outer_1 start")r = func(*args,**kwargs)print ("装饰器outer_1 end")return rreturn inner@outer
@outer_1
def fun1(a1):print ("fun1")f1 = fun1("多个装饰器")#返回值====================
装饰器outer start
====================
装饰器outer_1 start
fun1
装饰器outer_1 end
装饰器outer end

看懂了吗?不懂关系,小编创建了一个Python学习交流QQ群:531509025,群里有大量基础入门知识,都是从零开始的,群里还有专业的人给你解答问题。寻找有志同道合的小伙伴,互帮互助,群里还有不错PDF电子书!

python学习必备知识点: 装饰器相关推荐

  1. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了

    参考链接: 在Python中使用装饰器进行记忆 Python学习笔记--用装饰器decorator和Memoization记忆化提高效率 装饰器Memoization记忆化运用`functools`中 ...

  2. python学习笔记(装饰器、迭代器生成器、内置函数、软件目录开发规范)

    装饰器 定义:本质是函数,(功能:装饰其他函数):就是为其他函数添加附加功能 模拟场景一,在现有的函数中增加某个功能.现有的做法是定义新函数,并且加入函数中.需要修改源代码. def logger() ...

  3. Python学习笔记:装饰器

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. Python学习之路-装饰器生成器正则表达式

    装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(fu ...

  5. [转载] python学习笔记——@property装饰器

    参考链接: Python @property装饰器 上篇:https://blog.csdn.net/qq_42489308/article/details/89423412 @property装饰器 ...

  6. python学习笔记之——装饰器及对象

    1.反射之__import__ 我们知道import语句是用来导入外部模块的,当然还有from...import...也可以,但是其实import实际上是使用builtin函数__import__来工 ...

  7. Python学习之路--装饰器

    三元运算 变量 = 条件返回True的结果 if 条件 else 条件返回False ,用于简单 import time time.time() 1970年至今多少秒 time.sleep()暂时休眠 ...

  8. python学习笔记之装饰器、递归、算法(第四天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  9. Python学习之路——装饰器

    开放封闭原则:不改变调用方式与源代码上增加功能 ''' 1.不能修改被装饰对象(函数)的源代码(封闭) 2.不能更改被修饰对象(函数)的调用方式,且能达到增加功能的效果(开放) ''' View Co ...

最新文章

  1. AI近10年21个子领域高引学者(AI-10 Most Influential Scholars )
  2. global 和 nonlocal关键字
  3. Windows——蓝屏[失败的操作:WdFilter.sys]解决方案
  4. drf4 视图与路由组件
  5. C++ Primer 7.33 练习编写成员函数
  6. 中原工学院c语言期末考试题,中原工学院软件学院 2010年C语言 试卷A
  7. 终极JPA查询和技巧列表–第3部分
  8. dropMenu----简单的下拉菜单生成器
  9. apache 修改服务器配置,Apache服务器配置全攻略
  10. Chromium 内核新款 Edge 浏览器对比评测,微软找回面子全靠它了
  11. mysql 复制 错误_Mysql复制错误error
  12. 拓端tecdat|R语言改进的股票配对交易策略分析SPY-TLT组合和中国股市投资组合
  13. 国产计算机设备,国产计算机报价
  14. 汽车称重软件系统配置(一)
  15. UM2 3D 打印机 DIY 实践 ( 3) Marlin 固件配置篇
  16. CUDA编程.cu文件
  17. 听某个老师的ElasticSearch记的笔记了
  18. 【隔离的CAN通信接口-1Mbps】
  19. 杨慎的词------临江仙·滚滚长江东逝水
  20. 赴日IT的昨日和今朝

热门文章

  1. 如何让人工智能更加实际的辅助网络安全
  2. docker 安装redis第三方集群方案 codis
  3. 在翻译群里看到的一个句子的翻译
  4. 【ABAP】BASE64加密及解密
  5. php5.2通过saprfc扩展远程连接sap730成功案例
  6. 财务思维02-资产边界
  7. SAP HANA 三大特点
  8. “损失厌恶心理”怎么影响了我们?
  9. ABAP简介以及OpenSQL与NativeSQL的区别
  10. S4 Smartforms 改为WORD编辑器