python 装饰器的详细理解【多次实验】

demo:

 1 # 装饰器其实就是对闭包的使用
 2 print(‘haha嘻嘻‘)
 3 def hot():
 4     print(‘知道‘)
 5 def dec(fun):
 6     print("call dec")
 7     def in_dec():
 8         print("call in_dec")
 9         # fun()
10     # 必须加上返回语句,不然的话会默认返回None
11     return in_dec
12 hot()
13 @dec
14 def fun():
15     print("call fun")
16
17 fun()
18 # 注意上面的返回语句加上还有不加上的时候这一句执行的区别
19 print(type(fun))
20 fun()

运行结果:

1 haha嘻嘻
2 知道
3 call dec
4 call in_dec
5 <class ‘function‘>
6 call in_dec

执行顺序:

2——12——3,4——13——5,6——11——17——7,8——19——20——7,8

如果第7行将‘ # ’ 号去掉

则执行顺序:

2——12——3,4——13——5,6——11——17——7,8,9——14,15——19——20——7,8,9——14,15

发现:

1. python从上到下执行程序

2. 在装饰器前如果有需要执行的语句时,先完成前面语句的执行,在执行装饰器、

3. 执行装饰器时,必须携带参数【根据多次实验,必须含参,必须返回内容(返回的内容可以是值也可以是函数,是返回给装饰器装饰的函数的,也就是复制给装饰器装饰的函数的,所以必须返回,否则报错),而且该参数名可以随便取,但参数都是代表装饰器装饰的函数】

注意:如果装饰器返回内容为装饰器携带的参数,则返回的内容仍然为装饰器装饰的函数的,即当执行装饰器装饰的函数时,仍然执行本身

4. 再继续往下执行

原理:

在第三步中,@hahah => fun = dec(fun) ,到时候fun执行时是执行dec函数返回的数据

原文地址:https://www.cnblogs.com/littlebob/p/9308757.html

时间: 2024-07-31 09:06:15

python 装饰器的详细理解【多次实验】的相关文章

对Python装饰器的个人理解方法

0.说明 在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘记,其实本质上还是没有多花时间去搞懂其中的细节问题. 虽然网络上已经有很多这样的文章,但显然都是别人的思想,因此自己总是记不牢,所以花点时间自己好好整理一下. 最近在对<Python核心编程>做总结,收获了不少,下面分享一下我自己对于Python装饰器的理解,后面还提供了一个较为复杂的P

python装饰器的简单理解

如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你的业务函数.或者类(人)最后把这顶帽子带在这个人头上 Python装饰器就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能. 这个函数的特殊之处在于它的返回值也是一个函数,这个函数是内嵌“原“”函数的函数. # 有两个已经实现的方法def f1(): p

个人关于python装饰器的白痴理解

无参数装饰器 对于python小白来说,python的装饰器简直让人懵逼,不知如何理解,其实按照装饰器的字面意思, 就是把自己定义的函数装饰一遍,然后返回一个新的函数(注意是新的,已经不是本来定义的函数了) 为什么这么说,我用一个装饰器最原始的例子来说明,看一下代码: 1 #装饰函数 2 def decorator(foo): 3 def wrapper(): 4 print 'wrapper' 5 return foo() 6 return wrapper 7 8 #自定义函数 9 def a

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r

关于python装饰器(Decorators)最底层理解的一句话

一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.html 一步步教你理解Python装饰器 我作完了全部的测试.

理解Python装饰器(一)

python装饰器 装饰器是什么?我也不知道该如何给装饰器下定义. 1. 装饰器是函数,因为从代码的层面上来说,它就是开发人员定义的一个函数而已: 2. 装饰器就像是类的继承一样,通过装饰符,来实现函数与函数.函数与类之间的"继承" 3. 装饰器是种特殊的语法,通过 `@函数名` 或者 `@类名` 来实现函数或类的继承,但是 装饰器不是继承,装饰器装饰的函数会被当做参数传递给装饰器,这个功能又好像 C++中的虚函数,装饰器装饰的函数用来修改装饰器本身的功能来实现额外功能的添加. 示例:

理解 Python 装饰器看这一篇就够了

讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了.于是聪明的人们发明长裤,在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后宝宝再也不冷了.装饰器就像我们这里说的长裤,在不

转发对python装饰器的理解

[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文  http://blog.csdn.net/sxw3718401/article/details/39519587 主题 Python 最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是 AstralWind的一篇博文,以及Limodou的一篇文章.作为初学者,这两篇文章对新手有很大的帮助,但仍然有些不易理解的地方

python 装饰器、内部函数、闭包简单理解

python内部函数.闭包共同之处在于都是以函数作为参数传递到函数,不同之处在于返回与调用有所区别. 1.python内部函数 python内部函数示例: def test(*args): def add(*args): # 显示的调用外部函数的参数 return args return add(*args) # 返回内部函数的直接调用 运行结果如下: test(1,2,3) (1,2,3) 内部函数直接引用外部函数参数,外部函数test显示的返回内部函数add的调用.当需要在函数内部多次执行复