Python装饰器(二)

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

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

例子一:

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> 这样的结果。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win11任务栏透明度怎么调整?Win11任务栏透明度设置教程

许多小伙伴最近在使用Windows11的时候&#xff0c;总觉得Windows11的任务栏的颜色非常的难堪&#xff0c;想要自己把任务栏调整到透明的&#xff0c;那么具体我们要怎么调整Windows11任务栏透明度呢?下面小编就为大家介绍一下吧! 操作方法&#xff1a; 1、首先&#xff0c;我…

谷歌浏览器下载的文件保存在哪里?

许多人在使用谷歌浏览器上网时都会下载一些好看的电影、电视、小说或可玩性较高的游戏&#xff0c;但在完成下载后&#xff0c;却不清楚自己下载的东西放在了哪里!这不禁令人更好奇&#xff0c;谷歌浏览器下载的文件保存在哪里?下面让我们来了解一下。 方法步骤 打开Chrome浏…

Chrome浏览器隐藏扩展插件图标

隐藏Chrome浏览器扩展插件的图标。 隐藏之后 把鼠标移动到 上面显示那个红色的位置就可以拖动鼠标&#xff0c;然后就可以隐藏了。

如何设置允许PP视频访问相机

下面和大家分享一下如何设置允许PP视频访问相机&#xff0c;希望可以帮助到有需要的朋友。 如何设置允许PP视频访问相机 1、打开pp视频。见下图 如何设置允许PP视频访问相机 2、点击右下角我的。见下图 如何设置允许PP视频访问相机 3、点击打开设置。见下图 如何设置允许…

Ubuntu下virtualenv 安装

1、安装 vitrualenv。 sudo pip install virtualenv 2、在 Ubuntu 中以及其衍生系统中执行如下命令安装。 sudo apt-get install python-virtualenv 3、找个存放目录&#xff0c;创建虚拟环境。 virtualenv my_env 这个时候里面的虚拟环境里面的python版本是主机里面pyth…

如何更换里讯浏览器的皮肤?里讯浏览器更换皮肤的方法

里讯浏览器是一款极速、纯净的浏览器&#xff0c;软件拥有多种颜色的皮肤&#xff0c;可以根据个人的喜好更换自己喜欢的颜色&#xff0c;那么&#xff0c;怎么进行换肤呢?下面就由小编来告诉大家里讯浏览器换肤的方法。 方法步骤 1、打开里讯浏览器软件。 如何更换里讯浏览…

urllib2.URLError: urlopen error [Errno 111] Connection refused

记录个还没解决的问题。下面爬虫代码是可以执行的&#xff0c;但是在我的Ubuntu的虚拟中刚开始是可以运行的&#xff0c;但是&#xff0c;后来不知道改了什么东西&#xff0c;用urllib2写的爬虫和用scrapy 的爬虫代码都不能运行了&#xff01;&#xff01;。 import urllib2 i…

腾讯视频如何设置主设备

1、进入腾讯视频&#xff0c;点击右下角【个人中心】。 腾讯视频下载安卓版_腾讯视频如何设置主设备 2、在个人中心页面&#xff0c;点击【设置】。 腾讯视频下载安卓版_腾讯视频如何设置主设备 3、进入设置&#xff0c;点击【共享设备管理】。 腾讯视频下载安卓版_腾讯视…

Linux命令-关机,重启

转自https://www.linuxidc.com/Linux/2009-05/20134.htm 重启 1、reboot2、showdown -r now 立刻重启(root 用户使用) 关机 1、halt 立刻关机2、poweroff 立刻关机

win7系统如何共享硬盘分区

很多小伙伴不知道win7如何共享硬盘分区&#xff0c;共享硬盘分区可以让我们很好操作。其实win7共享硬盘分区的方法很简单&#xff0c;今天小编就来跟大家分享win7共享硬盘分区怎么操作&#xff0c;话不多说&#xff0c;感兴趣的小伙伴就跟小编一起往下看吧! win7系统如何共享硬…

springMVC,aop管理log4j,把当前session信息和错误信息打印到日志

((((其实还是不太理解aop的正真意义但是这样可以实现想要的了,我的感觉是执行一个方法时首先通过filter( 这个fiter可以不配置,之所以要他是因为在aop切入的方法session消失了,我们要保存是谁在操作就需要他) > aop管理的log4j类,>log4j 来搞定日志的处理)))) 记录一下…

Ubuntu/环境变量:修改/etc/environment 导致开机不能进入桌面

解决思路是&#xff1a;将环境变量的参数修改正确。 1、卡在界面的地方&#xff1a; CTRLALTF1&#xff0c;进入命令界面 2、临时修改环境变量 export PATH"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games" 3、这样就…

搜狗浏览器收藏夹在什么位置?搜狗浏览器收藏夹路径在哪?

搜狗浏览器是一款比较受大家欢迎的浏览器软件&#xff0c;很多都在问搜狗浏览器的收藏路径在哪。下面小编就为大家分享一下搜狗浏览器收藏夹在什么位置&#xff0c;接下来我们一起往下看看。 方法步骤 1、打开你的搜狗浏览器&#xff0c;你点击 “收藏”; 搜狗浏览器收藏夹在…

xp/win 7 系统搭建 Java环境

win 7 系统搭建 Java环境 xp系统大同小异 下面是具体的值

vim 强制保存只读文件

转自 http://kuanghy.github.io/2015/12/30/sudo-vim :w !sudo tee %

世界之窗浏览器怎么隐藏收藏栏?

想必大家都知道&#xff0c;无论是什么浏览器&#xff0c;默认都是会显示收藏栏的&#xff0c;这样用户就可以快速打开收藏栏中收藏的网页&#xff0c;但很多时候有些用户会收藏一些不想被人看到的网页&#xff0c;这时候最好的方法就是将收藏栏隐藏起来了。那么&#xff0c;世…

原始servlet+hibernate+struts2,从前台到后台的整个过程

现在三大框架的兴起ssh spring springmvc 基于注解式的编程简单方便了开发,但是让我感觉摸不着头绪,框架固然是好,提高了开发效率, 对企业有很大的帮助,框架封装的一些底层的东西让我不知道为什么要这么做,只知道该这么做,编程的路线肯定是简单快捷,趋势就是随便点点拖拖,就是…

Ubuntu中MySQL的启动/关闭/重启

一、启动 1. mysqld脚本启动: /etc/init.d/ mysql start 二、关闭 1. mysqld脚本关闭: /etc/init.d/ mysql stop 三、重启 1. mysqld脚本重启: /etc/init.d/ mysql restart 打开 mysql-client 客户端&#xff0c; mysql -u root -p

Win10怎么样修复edge浏览器?如何重置edge浏览器

在Windows10系统桌面右键点击左下角的开始按钮&#xff0c;在弹出的菜单中点击设置菜单项。 Win10怎么样修复edge浏览器&#xff1f;如何重置edge浏览器[多图] 在打开的Windows设置窗口中&#xff0c;点击应用图标。 Win10怎么样修复edge浏览器&#xff1f;如何重置edge浏览…

Hibernate实体映射配置1(java@注解方式)

实体和数据库之间存在某种映射关系&#xff0c;hibernate根据这种映射关系完成数据的存取。在程序中这种映射关系由映射文件&#xff08;*.hbm.xml&#xff09;或者java注解()定义。 本文以java注解的形式总结映射关系配置。 实体类组件以及注解标签映射关系 实体类--------…