python重写和装饰器_python中的装饰器

装饰器的本质:

当你在用某个@decorator来修饰某个函数func时,如下所示:

@decorator

def func():

pass

其解释器会解释成下面这样的语句:

func=decorator(func)

本质是把一个函数当作参数传递到另一个函数中,然后再调用。

def hello(fn):

def wrapper():

print "hello,%s" %fn.__name__

fn()

print "goodbye,%s" %fn.__name__

return wrapper

@hello

def foo():

print "I am foo"

>>>foo()

"hello,foo"

"I am foo"

"goodbye,foo"

hello(foo)返回了wrapper()函数,所以foo其实变成了wrapper的一个变量,而后面的foo()执行其实变成了wrapper()

多个装饰器:

@decorator_one

@decorator_two

def func():

pass

相当于func=decorator_one(decorator_two(func))

带参数的装饰器:

@decorator(arg1,arg2)

def func():

pass

相当于func=decorator(arg1,arg2)(func).这意味着decorator(arg1,arg2)这个函数需要返回一个“真正的装饰器”。

def mydecorator(arg1,arg2):

def _mydecorator1(func):

def _mydecorator2(*args,**kw):

res=func(*args,**kw)

return res

return _mydecorator2

return _mydecorator1

上面的函数返回的_mydecorator1才是真正的装饰器。因此,当装饰器需要参数时,必须使用第二集封装。因为装饰器在模块第一次被读取时由解释程序装入,所以它们的使用必须受限于总体上可以应用的封装器。

带参数及多个装饰器:

def makeHtmlTag(tag,*args,**kwds):

def real_decorator(fn):

css_class="class=‘{0}‘".format(kwds["css_class"]) if "css_class" in kwds else ""

def wrapped(*args,**kwds):

return ""+fn(*args,**kwds)+""+tag+">"

return warpped(*args,**kwds)

return real_decorator

@makeHtmlTag(tag=‘i‘,css_class=‘italic_css‘)

@makeHtmlTag(tag=‘b‘,css_class=‘bold_css‘)

def hello():

return "hello world"

>>>hello()

hello world

class式装饰器:

class mydecorator(object):

def __init__(self,fn):

print "inside mydecorator--init"

self.fn=fn

def __call__(self):

self.fn()

print "inside mydecorator--call"

@mydecorator

def myfunc():

print "inside myfunc"

>>>myfunc

"inside mydecorator--init"

"inside myfunc"

"inside mydecorator--call"

重写makeHtmlTag代码:

原文:http://my.oschina.net/935572630/blog/393489

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

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

相关文章

python3不等于号_python中的不等于号是什么

python中的不等于号用!表示。Python支持的比较运算符如下图所示比较运算符,也成关系运算符,用于对常量、变量或表达式的结果进行大小、真假等比较,如果比较结果为真,则返回 True;反之,则返回 False。比较运…

java的abstract的意思_java – spring中的abstract =“true”是什么意思?

Spring中的抽象bean有点不同于抽象类。事实上,Spring中的抽象bean甚至不需要映射到任何类。以此为例:和类:public class FooDao {private DataSource dataSource;private SomeHelper someHelper;private FooHelper fooHelper;//setters}publi…

错误:不能继续进行下一步操作 openfire 设置._如何为MacBook或Mac电脑恢复出厂设置...

mac电脑经过长时间的使用后会变得卡顿,或者因为部分操作方式改变以至于给我们在使用过程中造成障碍,此时我们可以进行恢复出厂设置,以此来解决部分问题。那么该如何为MacBook或Mac电脑恢复出厂设置呢?下面跟随小编来一起学习一下吧…

java枚举类型测试_Java枚举类的使用

1、自定义枚举类// 测试类public class enumDemo {public static void main(String[] args) {System.out.println(Season.SPRING);System.out.println(Season.SUMMER);System.out.println(Season.AUTUMN);System.out.println(Season.WINTER);}}// 自定义枚举类class Season {//…

mac显示网速_Mac网络流量监控工具——NetWorker pro

NetWorker pro for Mac是Mac系统上一款轻量级的网速实时监测软件,可以让用户在菜单栏上显示当前的网络上传下载速度,可以在速度和流量两种模式之间切换,也可以选择不同的网络模式来进行监测。此外,networker mac还提供有关当前活动…

南京java架构师工资_java架构师工资一般是多少?怎么提升才能获得高薪?

这几年Java一直以自身的优势霸占榜首,而且其实java架构师工资也是行业比较高的,下面来看看java架构师的工资到底有多少,当然这也是要区分地区的,以及怎样提高自己才能获得高薪呢?当程序员容易,当一个优秀的…

matlab gui学习手记_MATLAB论坛不可错过的30例GUI源代码

​过去的两年中,我经常会在微信公众号和知乎上分享,平时如何通过MATLAB制作GUI,来让自己的工作和生活更加便捷与高效。在分享的同时,有不少朋友会给我留言提问关于MATLAB GUI的问题。而其中的许多问题,其实都是能够在M…

线性回归csv数据集_用mxnet的gluon线性回归训练只有两个特征的数据集

前言自从上次试着用最基础的线性回归训练一个有80个特征的数据集,梯度爆炸之后,今天拿一个简单到不能再简单的数据集试试能不能成功收敛。途中我们又会遇到什么问题?数据集来自吴恩达机器学习课程第二周的课后练习。原本是txt文件&#xff0c…

java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式

在平时的项目开发中,应该会经常遇到上图所示的需求,就是在一个页面中有多个标签,被选中的标签颜色会高亮显示,切换不同标签显示相应的不同内容。如果内容代码过多则写在同一个html文件就会显得特别乱,所以这里我们最好…

Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结

文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂的应用程序,DOM 提供了大量灵活性。DOM标准是标准的。它很强壮且完整,并且有许多实现。这是许多大型安装的决定因素--特别是对产品应用程序,以避免在API发生改变时进行大量…

禅道项目管理_禅道 11.6.1 版本发布,完善细节,修复 Bug

禅道项目管理软件集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体,是一款功能完备的项目管理软件,完美地覆盖了项目管理的核心流程。禅道官网:www.zentao.net。大家好,禅道项目管理软件11.6.1发布&#xff0…

mendeley引用参考文献不显示_免费文献管理器Mendeley

June 2020有机合成化学文献检索今天小编给大家分享一款免费又好用的文献管理器——Mendeley,另外晶体cif文件下载—Materialsproject和COD数据库可在菜单栏的文献检索[文献管理/资源]中查看Mendeley是什么Mendeley是一款免费的跨平台文献管理软件,同时也…

pgsql vs mysql查询_对比平台--SQL Server Vs PostgreSQL

Microsoft SQL Server是一个数据库管理和分析系统,主要用于电子商务,业务范围和不同的数据仓库解决方案。另一方面,PostgreSQL是高级的对象关系数据库管理系统,它为SQL标准的扩展子集提供支持,包括不同的事务&#xff…

停车场管理系统代码_jsp19109商场商铺停车场服务系统-SSM-Mysql

jsp19109商场商铺停车场服务系统-SSM-Mysql该设计有演示视频    100%能运行买重包换  保密发送  一校一份编号:jsp19109语言数据库:jspMysql论文字数:12032字摘 要随着社会的发展,社会的方方面面都在利用信息化时代的优势。计…

java中compare语句的用法_Java RuleBasedCollator compare()用法及代码示例

java.text.RuleBasedCollat​​or类的compare()方法用于比较两个对象的强度,并且根据结果将返回0,正值和负值作为输出。用法:public int compare(Object o1, Object o2)参数:此方法需要两个对象之间进行比较。返回值:如果第一个对…

qregexp限制数字范围_数字系统实现电压电流控制的必经之路数模转换器

《芯势力》系列接上一篇文章,我们了解到了模数转换器,本文将带你了解数模转换器。看名字就能知道,如果模数转换器实现了模拟信号到数字信号的转换,那么,数模转换器就是模数转换器的逆过程,即把数字信号转换…

java 什么时候依赖注入_玩框架java依赖注入 – 何时使用单例

So I am wondering, should I be using singleton objects as the examples seem to imply? If this is the case, what is the advantage compared to the old static methods approach?依赖注入是一种将应用程序连接在一起的技术.您编写的组件并不直接相互依赖.而是将组件注…

四天人工智能 python入门体验课_百度深度学习7天打卡营,用Python+AI识别“青你2”小姐姐的高颜值...

原标题:百度深度学习7天打卡营,用PythonAI识别“青你2”小姐姐的高颜值“淡黄的长裙,蓬松的头发”,一夜之间洗脑全网,小姐姐们实在太让人上头了!导师“小甜豆”Lisa 满屏的大长腿、蚂蚁腰,又飒又…

js方式调用php_js如何调用php函数

js调用php函数的方法:jQuery.ajax({type: "POST",url: your_functions_address.php,dataType: json,data: {functionname: add, arguments: [1, 2]},success: function (obj, textstatus) {if( !(error in obj) ) {yourVariable obj.result;}else {conso…

最大子序列求和_算法——求最大子段和

一、问题描述给定由n个整数组成的序列(a_1,a_2,…,a_n),最大子段和问题要求该序列形如 的最大值(1≤i≤j≤n),当序列中所有整数均为负整数时,其最大子段和为0。例如,序列(-20, 11, -4, 13, -5, -2)的最大子段和为: 注意…