Python装饰器(一)

要学习装饰器,首先要知道闭包的东西。不过这里不再说闭包的东西了。

我们假设一个场景:假如在公司有多个开发部门,A、B....。现在A部门开发出了一个功能,然后其他部门去调用A部门开发的功能。

比如: 如下f1、f2...,是由A部门来开发,然后其他部门使用。

def f1():print('f1')def f2():print("f2")...

然后有一天根据业务需要,需要在每个方法添加验证,也就是在执行功能前进行身份验证。

这个时候想必大家心里也都有方法。

比如 在f1 函数里面直接修改该代码加上验证。或者把验证方法提取出来,封装成哥函数。在调用f1之前先调用验证方法。如果用这两方法来修改的话,那么在其他部门调用的时候也需要修改调用方法。

def f1():#验证print('f1')

上面的两种方法中虽然能实现要求,但是写代码要遵循 开放封闭 原则,虽然在这个原则是⽤的⾯向对象开发,但是也适⽤于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展。

我再说一种用闭包实现的方法。

def w1(fn):def inner():print("验证中---")fn()return innerdef f1():print("f1")f1 = w1(f1)
# 调用的时候也是使用 f1()

说一下这个实现原理。

w1函数是要验证的代码,Python在解释的时候从上到下扫描,然后开辟了两个内存块,并且有两个变量 w1和f1分别指向对应的内存块。(如上图A所示)

在执行到 f1 = w1(f1) 的时候,w1函数里面还有个函数的定义,那么在 w1里面开辟一个内存(上图右面w1里面蓝色的框),并且里面有个变量f1。这个时候 w1(f1) 执行完后返回了inner函数的地址,也就是上图右边蓝色框的地址,并且把f1函数的地址指向了蓝色框。

所以根据上面的代码在执行 f1() 的时候 首先执行f1新指向的蓝色框,然后再执行蓝色框里面指向的旧f1的代码。

这样就能达到在f1里面加上新的代码了。其实这种方法就是闭包实现的,那么其实还有其他方法,也就是要说的装饰器,首先开一下 用装饰器怎么实现。

def w1(func):print("----------w1----------")def inner():print("inner")func()return inner@w1
def f1():print("f1")print("执行-------")
f1()

只需要在 f1函数定义前面加上 @w1 就行了。这就是装饰器!

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

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

相关文章

怎么在QQ浏览器上使用微信聊天?

操作步骤: 1、启动qq浏览器。在qq浏览器界面中的插件栏中,会自动出现微信图标,浏览器自带了微信网页版的插件; 怎么在QQ浏览器上使用微信聊天? 2、点击该图标,然后会弹出一个二维码的窗口,拿出您的手机&…

搜狗输入法怎么清除输入记忆 搜狗输入法清除输入记忆方法

记忆功能清除方法如下: 1、打开搜狗输入法; 搜狗输入法怎么清除输入记忆 搜狗输入法清除输入记忆方法 2、进入搜狗主界面,点击右下角“我的”进入界面; 搜狗输入法怎么清除输入记忆 搜狗输入法清除输入记忆方法 3、进入“我的”界面,点击…

Python装饰器(二)

想再说一下装饰器的使用和原理。 之前已经说了装饰器的概念&#xff0c;和语法&#xff0c;这里想再进一步说一下几个装饰器的例子。 例子一&#xff1a; def makBlod(fn):def wrappen():return "<b>" fn() "</b>"return wrappendef makI…

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