这是看廖老师python教程的第一个的笔记,因为这是这份教程最难的章节之一,我来来回回看了三遍,终于有所突破,写在这里是为了巩固自己的理解,同时也是希望有错的地方能够得到指正。具体内容见廖雪峰老师的课程原址。

装饰器,起到增强函数的作用,同时我们不需要改动这个函数。这个部分之所以难,我觉得主要是难在对于返回函数的多次调用,容易打乱初学者的思路。接下来将分为以下三部分进行介绍:

初识装饰器

首先,装饰器要修饰的是一个函数,因此接收到函数是主体,是装饰器首要考虑的参数。以下是一个装饰器的基本模板。

#这是一个装饰器,接收一个函数func作为参数
def decorator(func):#接下来,要建一个对函数func进行处理的函数wrapper(这是装饰器的意义所在嘛)#这个函数是有要求的:1.接收所要处理函数func的参数(以wrapper参数接收)。2.函数func的返#回值,需要通过wrapper的返回值传回def wrapper(*args, **kw):{一系列函数调用前的操作}r = func(*args, **kw)      #r保存了返回值{一系列函数调用后的操作}return rreturn wrapper

尔后,这里有一个返回函数,返回函数,在调用外围函数的时候,它是不会马上执行的,需要接受到它特有的参数才行。

我们分析下课本的例子体会一下。首先,是一个简单的函数。

def now():print("2015-3-25")

现在,我们希望在这个基础上,打印出函数的调用日志。我们来填充上面那个模板。

def decorator(func):def wrapper(*args, **kw):#填充,函数执行前日志print('%s() start'%func.__name__)r = func(*args, **kw)      #r保存了返回值#填充,函数执行后日志print('%s() end'%func.__name__)return rreturn wrapper

接下来调用这个函数

now = decorator(now)  #这里是一个返回函数,返回了wrapper
now()         

返回值如下

接下来我们希望简化上面的过程,只需在now()定义的上方加上@decorator,看起来高大上,其实就是想说,now = decorator(now)。有了这个符号以后,直接调用now(),效果和上方完全一样了有木有,可以动手试一试。

@decorator
def now():print("2015-3-25")

关于参数传递和返回值处理

由于上一个例子的now()没有参数,我们实际上并不能很好的体会装饰器内部的参数传递机制,也就是def wrapper(*args, **kw)这里的参数有什么用。接下来看下一个例子。

错误提示里说,wrapper不能接受参数而add函数给了两个参数,啥意思?这里明明是在给add传参那。如果看到这里犯了这样的迷糊,那对装饰器的原理还没有理解。

上一节说过,当加了@decorator之后,就相当于add = decorator(add)。所以,这个时候add已经不是add了,它其实是返回的wrapper;所以,我们在In[3]的地方看到的add函数,实际上是wrapper函数了。

到此,可以看得很清楚,add需要的参数,需要通过wrapper的参数来传递,它的返回值,则需要通过wrapper的返回值来返回。(注:此时原add函数通过decorator(func)函数的形参func保存在外围函数中,具体原理且见返回函数那一节),做了修正,我们得到如下的运行结果。

到这里已经很完美了,但是,我们希望装饰器是一个通用物件,它不止是为add函数服务呀,还可以为其他各种函数打印运行日志。这个时候,便引入可变参数来替代原来的位置参数。运行如下。

补充关于装饰器有参数的说明

到这里其实装饰器的基本原理已经说明白了,但是这一节还有一个知识点有点捉急,如果装饰器本身也有参数(比如下文的text),就不止要操作的函数func有参数了。这里直接用课本的例子如下:

这里要指出,其实装饰器本质上就是一个处理函数的函数,因此核心是接收了func的那个函数(在本文就是decorator,因为它接收并处理函数),至于外围的log只是希望借助返回参数的闭包原理锁住text参数的。这一点由In[11]上的@log('execute')就可以看的很明白。log('exwcute')是啥,其实就是处理func的decorator函数呢。

技巧:不管嵌套了几层返回函数,最后@符号后面跟住的一定是处理函数的那个函数,如本文@decorator中的decorator函数,还有@log('execute'),其中log('execute')返回的返回函数,不正是decorator吗。

廖雪峰python教程笔记:装饰器相关推荐

  1. 廖雪峰Python教程-笔记

    廖雪峰Python教程 学习范围: Python基础 函数 高级特性 函数性编程 模块 面向对象编程 错误,调试和测试 IO编程 笔记: Python的整数没有大小限制 Python 3的字符串使用U ...

  2. 廖雪峰Python教程笔记(一)

    原文链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 感谢廖老师精彩的Pyt ...

  3. 廖雪峰Python教程笔记

    文章目录 创建只有一个值的 tuple 不可变对象调用方法 使用python的下标循环 全排列 python中的三目运算符 生成器 可迭代对象和迭代器 迭代器与生成器的区别 函数名是一个变量 高阶函数 ...

  4. 廖雪峰python教程整理笔记_python小白01廖雪峰python教程笔记

    高级特性 切片:前10个数,每两个取一个: L[:10:2]:[0, 2, 4, 6, 8] 可迭代对象的判断: isinstance('abc', Iterable) list变成索引-元素对:fo ...

  5. 廖雪峰python教程整理笔记_廖雪峰python教程笔记(一)

    变量与变量名 如 a = 123,此时,python解释器在做了两件事,在内存中创建了一个整数123对象,在内存中创建了一个名为a的变量.并把它指向123,一个赋值语句被执行后,内存中一个变量名与它所 ...

  6. Python 3 学习(一)—— 基础:廖雪峰 Python 教程学习笔记

    文章目录 Python教程 值类型和引用类型 列表和字典的基本操作 列表 元组 字典 Set 函数 内置函数 定义函数 空函数 参数检查 定义默认参数要牢记一点:默认参数必须指向不变对象! Pytho ...

  7. 廖雪峰Python教程 实战day05

    廖雪峰Python教程 实战day05 1. Web程序工作流程 本文部分文字内容.图片摘自<Flask Web开发实战:入门.进阶与原理解析>,作者李辉. 在编写自己的Web框架之前,首 ...

  8. 廖雪峰python教程视频-为什么看不懂廖雪峰的Python学习教程?

    廖雪峰的Python教程已经很友好了,接近于把饭喂到嘴边了. 这不是廖雪峰教程的问题,而是一个基础代码技能和实际应用需求的代码技能差距太远导致的. 如果是新手,只学会了廖雪峰Python教程,那约等于 ...

  9. 廖雪峰python教程完整版-为什么看不懂廖雪峰的Python学习教程?

    廖雪峰的Python教程已经很友好了,接近于把饭喂到嘴边了. 这不是廖雪峰教程的问题,而是一个基础代码技能和实际应用需求的代码技能差距太远导致的. 如果是新手,只学会了廖雪峰Python教程,那约等于 ...

最新文章

  1. mongodb的几种启动方法
  2. python 爬虫实例-python爬虫实例,一小时上手爬取淘宝评论(附代码)
  3. JavaScript 的简单学习2
  4. c语言找最长串指针改错,全国计算机二级C语言上机 (改错题)【DOC精选】.doc
  5. 5.3矩阵的压缩存储(稀疏矩阵转置和快速转置)
  6. 试解析Tomcat运行原理(一)--- socket通讯
  7. python进阶13并发之九多进程和数据共享
  8. java 字符串递归_关于java:递归函数以通配符模式匹配字符串
  9. 智能优化算法:人工电场优化算法-附代码
  10. 网站五万ip需要服务器,30万IP网站要用什么样的服务器?
  11. 计网 - 计算机网络开篇
  12. 批量将多个 PDF 文件合并成一个独立的 PDF 文件
  13. rds对mysql优化_RDS MySQL参数调优最佳实践
  14. Devc++还原ggcc.graphics.h
  15. 计算机二级第一次考试不及格有没有影响,计算机二级还没有过吗?
  16. 基于Jenkins搭建iOS持续集成开发环境
  17. 先验分布 后验分布 似然估计
  18. List Set Map 集合不可修改
  19. 自动化测试之:猴子测试Windows端GUI-Monkey实现
  20. 光彩夺目的30款太阳光线照射Ps笔刷

热门文章

  1. Android 平板中 自定义键盘(popuwindow) 居于屏幕左下方 仿微信的密码输入界面
  2. 转载《士兵突击》观后杂感
  3. s18服务器维护,8月11日S15至S18服务器合服公告!
  4. 搜集整理的一些博客导航
  5. 人身三流指什么_关于《三流人生》那些事儿
  6. 对 BFC 规范(块级格式化上下文:block formatting context)的理解?
  7. 在SecureCRT使用sz与rz命令上传、下载文件命令介绍
  8. 各种通信铁塔和机房类型介绍,别再傻傻分不清了
  9. 万代南梦宫(中国)旗下数字娱乐、玩具娱乐业务整合;IBM简化混合云上关键任务应用的现代化进程 | 全球TMT...
  10. 零售企业如何快速开上千家门店,揭秘名创优品的低价超级产品战略