1.认识装饰器

  如果你经常看我的博客,你已经学会了python的前两大‘神器’(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内部代码的情况下增添新的功能,接下来我将一步步的解析python的装饰器。

2.闭包

  在解析装饰器之前我们需要先了解下闭包的概念,我们先通过一段代码了解闭包

# 定义一个函数
def test(number):# 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包def test_in(number_in):print("in test_in 函数, number_in is %d" % number_in)return number+number_in# 其实这里返回的就是闭包的结果return test_in# 给test函数赋值,这个20就是给参数number
ret = test(20)# 注意这里的100其实给参数number_in
print(ret(100))#注 意这里的200其实给参数number_in
print(ret(200))

 运行结果

in test_in 函数, number_in is 100
120in test_in 函数, number_in is 200
220

看完这段代码我们不妨总结下闭包的作用:  

  1.函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候 就是引用传递

  2.闭包就是一个嵌套定义的函数,在外层运行时才开始内层函数的定义,然后将内部函数的引用传递函数外的对象

  3.内部函数和使用的外部函数提供的变量构成的整体称为闭包

3.初识装饰器

  为什么在解释装饰器时要先了解闭包的概念呢?看完下面的代码你也会就会明白

def decorate(func):def inner():return "<i>"+func()+"</i>"return inner@decorate
def func():return "你好"print(func())

 运行结果

<i>你好</i>

  我们可以看出装饰器就是在闭包的基础上做了一些修改。

4.装饰器普通传参

from time import ctime, sleep

def timefun(func):    def wrapped_func(a, b):        print("%s called at %s" % (func.__name__, ctime()))        print(a, b)        func(a, b)    return wrapped_func

@timefundef foo(a, b):    print(a+b)

foo(3,5)sleep(2)foo(2,4)

运行结果

foo called at Thu Aug 23 21:30:21 2018
3 5
8
foo called at Thu Aug 23 21:30:23 2018
2 4
6

5.装饰器不定长传参

from time import ctime, sleepdef timefun(func):def wrapped_func(*args, **kwargs):print("%s called at %s"%(func.__name__, ctime()))func(*args, **kwargs)return wrapped_func@timefun
def foo(a, b, c):print(a+b+c)foo(1,2,3)
sleep(1)
foo(4,5,6)

运行结果

foo called at Thu Aug 23 21:32:50 2018
6
foo called at Thu Aug 23 21:32:51 2018
15

 其实这里只是运用了python函数传参时的不定长传参的概念 

6.装饰器中的return

from time import ctime, sleepdef timefun(func):def wrapped_func():print("%s called at %s" % (func.__name__, ctime()))func()return wrapped_func@timefun
def foo():print("I am foo")@timefun
def getInfo():return '----hahah---'foo()
sleep(2)
foo()print(getInfo())

 运行结果

foo called at Thu Aug 23 21:36:22 2018
I am foo
foo called at Thu Aug 23 21:36:24 2018
I am foo
getInfo called at Thu Aug 23 21:36:24 2018
None

7.装饰器工厂(flask定义一个路由的方式)

from time import ctime, sleepdef timefun_arg(pre="hello"):def timefun(func):def wrapped_func():print("%s called at %s %s" % (func.__name__, ctime(), pre))return func()return wrapped_funcreturn timefun@timefun_arg("php")
def foo():print("I am foo")@timefun_arg("python")
def too():print("I am too")foo()
sleep(2)
foo()too()
sleep(2)
too()

运行结果

foo called at Thu Aug 23 21:40:34 2018 php
I am foo
foo called at Thu Aug 23 21:40:36 2018 php
I am foo
too called at Thu Aug 23 21:40:36 2018 python
I am too
too called at Thu Aug 23 21:40:38 2018 python
I am too

  

 

我们分析下装饰器工厂装饰过程
  1. 调用timefun_arg("itcast")
    2. 将步骤1得到的返回值,即time_fun返回, 然后time_fun(foo)
    3. 将time_fun(foo)的结果返回,即wrapped_func

  4. 让foo = wrapped_fun,即foo现在指向wrapped_func

8.类装饰器

class Test(object):def __init__(self, func):print("初始化中....")print("func name is %s"%func.__name__)self.__func = funcdef __call__(self):print("装饰中......")self.__func()@Test
def test():print("----test---")
test()

运行结果

初始化中....
func name is test
装饰中......
----test---

我们也许会发现装饰器中有个很特别的方法__call__(),这个方法时python内置的魔法方法,它作用就是让类能够向函数一样直接被调用,接下来我会专门更新一篇python中的魔法方法,如果想要了解的朋友可以关注我

总结

 1.装饰器函数只有一个参数就是被装饰的函数的应用

  2.装饰器能够将一个函数的功能在不修改代码的情况下进行扩展

  3.在函数定义的上方@装饰器函数名 即可直接使用装饰器对下面的函数进行装饰。

 

转载于:https://www.cnblogs.com/xuchuankun/p/9526487.html

python三大神器===》装饰器相关推荐

  1. python三大神器装饰器_Python2.x

    1)自动化 2)python编写的 openstack jumpserver ansible SaltStack yuanj zabbix json docker yaml 2)The Zen of ...

  2. python三大神器装饰器_Python3 - 复习(update to Day6)

    # 第一优先级规则声明: # 除了梦境,每一个意识主进程都必须与一个身体参与的机械进程相匹配,否则结束意识主进程.如学习python同时必须伴有记笔记.敲代码等机械进程,学习英语必须伴有朗读.听说.查 ...

  3. python装饰器原理-python 中的装饰器及其原理

    装饰器模式 此前的文章中我们介绍过装饰器模式: 装饰器模式中具体的 Decorator 实现类通过将对组建的请求转发给被装饰的对象,并在转发前后执行一些额外的动作来修改原有的部分行为,实现增强 Com ...

  4. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

  5. python类装饰器详解-python 中的装饰器详解

    装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...

  6. python中的装饰器decorator

    python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x):return ...

  7. python生成器和装饰器_python之yield与装饰器

    防伪码:忘情公子著 python中的yield: 在之前发布的<python之列表解析与生成器>中我们有提到过,生成器所实现的是跟列表解析近似的效果,但是我们不能对生成器做一些属于列表解析 ...

  8. 二十一、深入Python强大的装饰器

    @Author: Runsen 文章目录 闭包 装饰器 嵌套函数的装饰器 带参数嵌套函数的装饰器 类装饰器 嵌套装饰器 @Date:2019年07月11日 最近有同学在问关于Python中装饰器的问题 ...

  9. Python闭包与装饰器

    Python闭包与装饰器 一.闭包       函数是一个对象,所以可以对象的形式作为某个函数的结果返回.函数执行完后内部变量将会被回收.在闭包中,由于内部函数存在对外部函数的变量的引用,所以即使外部 ...

  10. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

最新文章

  1. Spring MVC前后端的数据传输
  2. COMMIT WORK AND WAIT 是在WAIT什么
  3. Apache Nutch 1.3 学习笔记十一(页面评分机制 OPIC)
  4. 【转】子网划分实例与讲解
  5. Nginx+Tomcat+Memcached实现tomcat集群和session共享
  6. android studio黄油刀依赖,如何在Android Studio中设置ButterKnife插件?
  7. 作者:孙晨(1995-),女,华东师范大学数据科学与工程研究院硕士生
  8. 【Spring 持久层】Spring 与 Mybatis 整合
  9. Linux三个网络监视器之《三》——vnstat
  10. Unirech腾讯云代充-关于腾讯云国际版云服务器实例调整配置常见问题
  11. hexo博客微博图床失效解决办法
  12. 解决联想拯救者Y9000X触控板失灵问题
  13. 阿里云网站备案与域名解析操作流程
  14. 结构图的分类--产品功能结构图、产品信息结构图、产品结构图
  15. matlab 视频采集卡,视频采集卡怎么用?视频采集卡使用方法图文详解
  16. vs2005 无法启动程序 系统找不到指定的文件---解决方案
  17. 2022春招各大厂高频面试题汇总
  18. 论文笔记 Entity-Relation Extraction as Multi-turn Question Answering | ACL2019
  19. 九州云出席全球人工智能开发者先锋大会,圆桌论道开源未来
  20. Unicode码转UTF8

热门文章

  1. boost::log模块实现多线程异步日志记录示例
  2. VTK:相互作用之CallData
  3. VTK:图片之Cast
  4. OpenCV进口重建Import Reconstruction
  5. 将JavaScript集成到QML中
  6. Qt Creator用户界面
  7. OpenGL coordinate systems坐标系统的实例
  8. OpenGL Cubic Bezier三次贝塞尔曲线修补实例
  9. STL的deque容器
  10. C++中int id[sizeof(unsigned long)]的语句,正确吗?