想再说一下装饰器的使用和原理。

之前已经说了装饰器的概念,和语法,这里想再进一步说一下几个装饰器的例子。

例子一:

def makBlod(fn):def wrappen():return "<b>" + fn() + "</b>"return wrappendef makItalic(fn):def wrappen():return "<i>" + fn() + "</i>"return wrappen@makBlod
def test1():return "hello world - 01"@makItalic
def test2():return "hello world - 02"@makBlod
@makItalic
def test3():return "hello world - 03"print(test1())
print(test2())
print(test3())

首先看到上面的例子的时候,函数 test1和test2的执行结果一看就了然于心,那么test3函数的执行结果真的是要好好想想解释器的原理了。先看结果。

<b>hello world - 01</b>
<i>hello world - 02</i>
<b><i>hello world - 03</i></b>

那么装饰器的原理到底是怎么样呢!比如 test3 这个函数被两个装饰器@makBlod和@makItalic 同时装饰了。那么在具体说明原理之前先说一下装饰器在装饰的时候是从下向上装饰的,看下面代码和执行结果。

def makBlod(fn):print("makBlod")def wrappen():return "<b>" + fn() + "</b>"return wrappendef makItalic(fn):print("makItalic")def wrappen():return "<i>" + fn() + "</i>"return wrappen@makBlod
@makItalic
def test3():return "hello world - 03"print(test3())
makItalic
makBlod
<b><i>hello world - 03</i></b>

在装饰器里面加了各加了一行代码,从代码的执行的结果可以看出,makItalic装饰器先执行了,然后才是上面makBlod装饰器执行。由此可得出,装饰器在装饰的时候是从下向上装饰的(也就是先@makItelic然后才是@makBlod )。

第一步:装饰 @makItali,看粉色的线段,这个时候全局下的变量test3指向了makItalic 函数里面函数 wrappen 的位置,也就是说此时,全局下的函数test3在执行的时候是执行 makItalic 里面的 wrappen函数,wrappen的test3函数就指向原来test3函数的指引位置。

第二部:装饰 @makBlod,看绿色的线段。因为第一步里面test3函数是 makItalic 里面的wrappen,所以在装饰的时候,穿进去局部变量函数test3应该是 makItalic 里面的wrappen(看绿色曲线所指引的位置),在makBlod函数装饰完成后,全部变量test3所指引的位置应该是 makBlod函数里面的wrappen局部函数。

上面两步装饰器的装饰工作完成,那么在调用的时候,test3() 。

1、makBlod函数里面的wrappen先执行。

2、makItalic函数里面的wrappen载执行。

3、最下面那个代码块再执行(就是原来全局下test3所指引的位置)

这个执行完后,return 出来的结果就构成了 <b><i>hello world - 03</i></b> 这样的结果。

Python装饰器(二)相关推荐

  1. python 装饰器 二 (装饰带参数的函数)

    #!/usr/bin/env python #_*_coding=utf-8_*_ #Author: xieyixue #mail: xyx_0410@163.com #Created Time: 2 ...

  2. 【python 8】python 装饰器

    文章目录 一.什么是 python 装饰器 二.装饰器的使用 三.装饰器类型 3.1 特性装饰器 @property 3.2 类装饰器 @classmethod 3.3 静态装饰器 @staticme ...

  3. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  4. python装饰器-Python基础-20装饰器

    20.装饰器 20.1 函数基础知识 在Python中函数为一等公民,我们可以: 把函数赋值给变量 在函数中定义函数 在函数中返回函数 把函数传递给函数 20.1.1 把函数赋值给变量 在Python ...

  5. python 装饰器 参数-[Python]写个带参数的装饰器

    上篇文章 Python装饰器为什么难理解?从函数到装饰器一步一步介绍了Python装饰器的来由,不知你对装饰器理解了没有,强烈建议你自己动手写个装饰器应用到项目中加深理解.装饰器可以很简单,也可以很复 ...

  6. python装饰器原理-深刻理解python装饰器

    我们要完全理解python装饰器,不是很容易,主要归结有如下困难: 1. 关于函数"变量"(或"变量"函数)的理解 2. 关于高阶函数的理解 3. 关于嵌套函数 ...

  7. python装饰器原理-python装饰器的原理和使用

    一.最简单的装饰器 装饰器是python中很基础也很实用的一个特性.通过装饰器我们可以很方便地为一些函数添加相同的功能.我们以测量函数运行时间为例来讲一讲python装饰器的运行原理. 1.使用装饰器 ...

  8. python装饰器原理-简单了解python装饰器原理及使用方法

    这篇文章主要介绍了简单了解python装饰器原理及使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 如果你接触 Python 有一段时间了的话 ...

  9. python装饰器实例-python装饰器实例大详解

    原标题:python装饰器实例大详解 一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我 ...

  10. python装饰器-python装饰器简介---这一篇也许就够了(推荐)

    Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼. 装饰器引入 初期及问题诞生 假如现在在一个公司,有A B C三个业务部门,还有S一个基 ...

最新文章

  1. 启明云端技术社区之星--张梦玉
  2. 日历 日期时间选择器
  3. MySQL数据库InnoDB坏页处理修复
  4. 面试题,反射创建类实例的三种方式是什么
  5. pyQt显示系统文件目录
  6. vs快速生成get set方法_怎么祛斑快速祛斑的方法是什么?Get正确的祛斑方法
  7. 【Linux 系统编程】vim 的安装配置及使用
  8. IntelliJ IDEA个人许可证赠品报告和获奖者
  9. Linux selinux关闭方法和防火墙关闭方法
  10. 华为android怎么换字体大小,华为手机设置字体大小的具体步骤
  11. 计算机网络自顶向下第七版第四章答案,《计算机网络·自顶向下方法》第七版 第四章 课后习题与问题 答案...
  12. H3CNE中静态路由实验
  13. Android实现九宫格图片控件
  14. ABAQUS中inp文件的使用和书写
  15. VC 控制台颜色设置
  16. 切割木板 (贪心)
  17. Oracle 层级数据计算方式start with connect by
  18. 基于树莓派和LD3320模块的语音识别控制
  19. vue中拿到接口,并获取数据,渲染到页面
  20. 会计资料无纸化已经全面来临,iBox开始步入硬软结合的新时代

热门文章

  1. UNION 和UNION ALL 的区别
  2. office高级应用与python综合案例教程_office高级应用与python综合案例实验指导--详细介绍...
  3. es统计有多少个分组_ES 24 - 如何通过Elasticsearch进行聚合检索 (分组统计)
  4. 华为手机的分类有何区别_“鸿蒙”系统能不能玩安卓游戏?如果能,它跟安卓系统有何区别?...
  5. 存储器间接寻址方式_8086中的数据存储器寻址模式
  6. julia在mac环境变量_在Julia中找到值/变量的类型
  7. 将搜索二叉树转换为链表_将给定的二叉树转换为双链表(DLL)
  8. linux下php的安装,Linux下PHP安装
  9. mysql 输出参数 sql语句_MySQL: 详细的sql语句
  10. python教程循环语句_Python教程:关于Python 循环语句