python:装饰器

1.情景引入。

现在已经完成了一个python项目,但是我们为了安全起见,我们需要加入验证机制。不是所有人都能调用函数
原始源代码
def f1():print 'f1'def f2():print 'f2'def f3():print 'f3'

由于必须遵循开发闭包的原则,所以我们应该尽可能的是不去改动原来函数的内部代码,而是通过其他的一些方法添加新的功能
比如通过下面这样的方法

#首先定义一个验证函数,参数为一个函数
def verification(func):print("verification success!!!")return func   #返回传入函数的首地址def f1():print 'f1'def f2():print 'f2'def f3():print 'f3'f1=verification(f1)
#执行这一句代码后,会直接输出"verification success!!!",因为我们执行了verification这个函数。然后返回传入函数的地址
#再执行返回的函数,这样就会执行f1()这个函数
f1()
#最终结果
"""
verification success
f1
"""

换一种写法,实现和上面同样的功能——–装饰器

def verification(func):print("verification success!!!")return func   #返回传入函数的首地址@verification 
def f1():print 'f1'

@verification跟上一段代码的f1=verification(f1)这条语句等价,此时的f1已经是verification函数的返回值了,即func

上面的代码不经过任何调用直接运行
结果:
verification success!!!
加一条代码
f1=f1()   #相当于f1=func(),func是verification返回的函数,即原f1()函数结果:
verification success
f1

由此我们发现了一个问题,那就是我们直接使用@verification的时候他是直接执行了verification这个函数,因此他会先有输出”verification success“,这就出现了不统一的问题,按照我们原来的设想是”verification success“和”f1“应该同时输出的。因此我们用相同的原理,写一个内部函数,通过返回内部函数的地址,达到不执行函数的效果
代码如下:

def verification(func):def inner():print "verification success"func()return inner   #返回了一个函数的地址,没有直接执行@verification  
def f3():print 'f3'

此时函数f3已经变成了inner了,然后我们调用f3,即inner

f3()  #这里就直接执行了inner函数
输出结果
verification success
f1

实现(原函数无返回值)

def verification(func):def inner(arg):if arg>100:func(arg)else:print "verification fail"return inner@verification
def f1(num):print num@verification
def f2(num):print numf1(101)
f2(88)
结果:
101
verification fail

原函数有返回值

def verification(func):def inner(arg):if arg>100:return func(arg)else:return  "verification fail"return inner@verification
def f1(num):return "data is %d"%num@verification
def f2(num):return "data is %d" % numprint f1(101)
print f2(88)结果:
data is 101
verification fail

多参数传递

"验证功能的函数"
def verification(func):def inner(*args,**kargs):if 'password' in kargs:password=kargs['password']else:password='000'if password=='233':return func(*args)else:return  "verification fail"return inner@verification
def f1(num):return "data is %d"%(num)@verification
def f2(num):return "data is %d" % numprint f1(101,password='233')  #此时的f1其是inner函数
print f2(88)#结果:
data is 101
verification fail

2.装饰器

就如同以上代码一样,想要对一个已有的模块做一些“修饰工作”,所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去。

3.进阶版—-带参数Decrorator

def makeHtml(tag,*args,**kwargs):def realDeco(main_fun):if 'css_class' in kwargs:css_class="class={}".format(kwargs['css_class'])else:css_class=Nonedef wrapper(*args,**kwargs):return "<"+tag+" "+css_class+">"+main_fun(*args,**kwargs)+"</"+tag+">"return wrapperreturn realDeco@makeHtml(tag="b",css_class="bold_css")
def index():return 'hello world'print index()

执行过程
到@makeHtml时,程序执行过程
1.先执行makeHtml(tag=’b’,class=’bold_css’)函数,返回realDeco的地址
2.执行realDeco(index),获取到css_class变量的值,返回wrapper
3.执行print index().此时此刻的index=wrapper,执行wrapper()函数,
4.执行main_fun(即原index函数),重新拼接得到<b class=bold_css>hello world</b>,最后返回了这个值

执行结果:

<b class=bold_css>hello world</b>

待续。。。。

转载于:https://www.cnblogs.com/cmustard/p/6769936.html

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

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

相关文章

mysql sys exec_python - 使用MySQL UDF执行命令-sys_exec不起作用 - 堆栈内存溢出

我正在尝试从MariaDB服务器运行python脚本。 我已经为此安装了mysqludf库。 我正在尝试使用sys_exec函数运行脚本&#xff0c;但是没有结果。 我已经创建了测试文件&#xff0c;它只是一个带有信息“ DONE”的.txt文件。我以root用户身份执行命令&#xff0c;因此我拥有所有特权…

2、Redis入门介绍

1、什么是Redis Redis&#xff1a;REmote DIctionary Server(远程字典服务器) 是完全开源免费的&#xff0c;用C语言编写的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的(key/value)分布式内存数据库&#xff0c;基于内存运行。并支持持久化的NoSQL数据库&#xff0c;是当…

Coursera公开课-Machine_learing:编程作业7

这周的编程作业主要是两方面内容。 1.K-means聚类。 2.PCA&#xff08;Principle Component Analys&#xff09;主成分分析。 方式主要是通过对图像的聚类实现压缩图像&#xff0c;后来发现PCA也可以通过对主特征值的提取实现压缩图像的目的。很有意思&#xff0c;具体的内容参…

CF722D. Generating Sets[贪心 STL]

D. Generating Setstime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given a set Y of n distinct positive integers y1, y2, ..., yn. Set X of n distinct positive integers x1, x2, ..., xn is sa…

mysql sql running no_【MySql】复制出现Slave_SQL_Running: No 错误解决

收到报警&#xff0c;mysql的从数据库在同步的过程出现问题&#xff0c;已停止同步。ERROR] Slave SQL: Error "Lock wait timeout exceeded; try restarting transaction" on query. Default database: "yang". Query: "UPDATE workitem SET statu…

使用VS2010调用matlab的mat格式文件

做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵&#xff0c;需要把labels.mat读入VS2010中&#xff0c;实现功能&#xff0c;在此把实现过程记录下来。 C读取mat文件的步骤如下。 1. vs2010的配置 新建一个工程&#xff0c;在属性管理器中选择 工程->属性-…

mysql 中间件 atlas_Mysql中间件代理 Atlas

本文接上文介绍atlas的安装配置&#xff0c;以及借助keepalive软件实现altas的ha&#xff0c;避免由于atlas故障&#xff0c;导致数据库服务中断的情况出现&#xff1a;一&#xff1a;环境介绍Atlas 主&#xff1a;192.168.1.12/24Atlas 从&#xff1a;192.168.1.81/24Atlas vi…

nodejs mysql事务处理_关于NodeJs如何使用Mysql模块实现事务处理实例

本篇文章主要介绍了NodeJs使用Mysql模块实现事务处理 &#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来看看吧依赖模块&#xff1a;1. mysqlnpm install mysql --save2. asyncnpm install async --save(ps: async模块可…

如何正确的通过 C++ Primer 学习 C++?(转自知乎)

作者&#xff1a;dawnmist链接&#xff1a;https://www.zhihu.com/question/32087709/answer/54936403来源&#xff1a;知乎著作权归作者所有&#xff0c;转载请联系作者获得授权。个人经验&#xff0c;C primer 第一次可以跳着看。关键是要尽快用起来&#xff0c;在使用中熟练…

Androidstudio连mysql_MySQL数据库之Android Studio使用JDBC远程连接mysql的注意事项(附示例)...

本文主要向大家介绍了MySQL数据库之Android Studio使用JDBC远程连接mysql的注意事项(附示例) &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。JDBC为java程序访问各种类型的关系型数据库提供了统一的接口&#xff0c;用户不必针对不同数…

纪中2016.10.6比赛不明总结

100<分数<310 ———————————————————————————————————— 期望值&#xff1a; |T1&#xff1a;100/T2&#xff1a;10/T3&#xff1a;100/T4&#xff1a;100 ————————————————————————————————————…

zendstudio快捷键收录

360截屏快捷键&#xff1a;ctrlshiftxzendstudio:注释代码&#xff1a;ctrlshift/删除光标所在行&#xff1a;ctrlD复制当前行&#xff1a;ctrlalt↓上下行互换:alt↑/↓代码格式化&#xff1a;CtrlshiftF&#xff0c;缩进&#xff1a;tab代码折叠快捷键&#xff1a;Ctrl/(小键…

centos8.2安装mysql_centos8安装mysql

通过以root用户或者具有sudo特权的用户身份使用CentOS软件包管理器(dnf)来安装MySQL 8.0# dnf install mysql安装好后&#xff0c;这里注意需要修改两个文件的权限&#xff0c;否则启动失败。# chown -R mysql:mysql /var/run/mysqld# chmod -R 777 /var/lib/mysql设置为开机自…

dedecms代码研究三

上次&#xff0c;我们从dedecms的index.PHP文件中了解到了很多信息&#xff0c;也提出了一些问题&#xff1a; 1&#xff09;加载了/include/common.inc.php&#xff0c;里面做了哪些工作&#xff1f;2&#xff09;/include/arc.partview.class.php到底是干什么的&#xff0c;/…

idea快捷操作_IDEA插件系列 快捷键神器!Key Promoter X

今天起&#xff0c;会陆续给大家介绍一些IDEA的插件。正所谓工欲善其事必先利其器&#xff0c;一款好的插件可以帮我们提升开发效率&#xff0c;或者提升使用IDEA的幸福感&#xff01;今天要推荐的第一款插件 Key Promoter X 。相信很多新手甚至老手&#xff0c;对IDEA中的快捷…

《开讲啦》 20160910 颜宁:女科学家去哪儿了?

视频地址&#xff1a; 《开讲啦》 20160910 颜宁&#xff1a;女科学家去哪儿了&#xff1f; 果然是女神科学家&#xff0c;讲了一些我很感兴趣的东西&#xff0c;让我也体会到了女神的气质&#xff0c;有点感触&#xff0c;这个节目不错&#xff0c;可以追。 颜宁教授于2016年5…

if __name__ == __main__:什么意思_秒懂Python编程中的if __name__ == 'main' 的作用和原理...

来源&#xff1a;菜鸟分析 链接&#xff1a;https://zhuanlan.zhihu.com/p/34112508一天偶然发现知乎上有篇关于对python编程中的if __name__ main的理解陈述&#xff0c;看完之后&#xff0c;自己觉得不够简单明了&#xff0c;于是在其文章底部写了一句话&#xff0c;突然收获…

4.openstack之mitaka搭建glance镜像服务

部署镜像服务 一&#xff1a;安装和配置服务 1.建库建用户 mysql -u root -p CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO glancelocalhost IDENTIFIED BY 密码; GRANT ALL PRIVILEGES ON glance.* TO glance% IDENTIFIED BY 密码; flush privileges; 2.keys…

mysql php 变量赋值,在MySQL UPDATE(PHP / MySQL)中使用变量

I am using this code so I can update a record in database:$query mysql_query("UPDATE articleSET com_count ". $comments_countWHERE article_id .$art_id ");My question is: How can I use variables in a MySQL UPDATE statement.解决方案$query m…

mongodb 教程一

mongodb是nosql&#xff08;not only sql&#xff09;的一种方式 。是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL - 代表着不仅仅是SQL- 没有声明性查询语言- 没有预定义的模式-键 - 值对存储&#xff0c;列存储&#xff0c;文档存储&#xff0c;图形数据库- 最…