一、什么是装饰器

目的:给func()方法,增加一个功能,在fun()执行期间,同时把fun()执行速率机算出来

 import time
def func():
print('嘻嘻哈哈') start_time = time.time()
time.sleep(0.1)
func()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))

如果,我们给fun1,fun2,fun3,实现相同的功能呢?

 def func():
print('嘻嘻哈哈') def timmer(f):
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time)) f = func
func = timmer
func(f)

但是,每次都需要将函数作为函数,传递给timmer(),而且这种方式已经破坏了原有的逻辑结构,之前的逻辑结构,是执行fun的同时,计算执行效率,但是现在是把fun传给第三方函数,进行计算。

怎么解决这种问题呢,装饰器。

装饰器就是:在不改动原函数代码前提下,增加额外的功能,装饰的返回值也是一个函数对象。

 def func():
print('嘻嘻哈哈') def timmer(f):
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))
return timmer f = timmer(func)
f()

@语法糖 : 在定义函数的时候使用,避免再一次赋值操作。

代码修改如下:

 def timmer(f):
start_time = time.time()
time.sleep(0.1)
f()
end_time = time.time()
print('----> 执行效率%s'%(end_time - start_time))
return timmer @timmer
def func():
print('嘻嘻哈哈')

二、带参数的装饰器

 import time

 def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
time.sleep(0.1)
f(*args,**kwargs)
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return inner @wrapper
def fun(a):
print("%s嘻嘻哈哈" %(a)) @wrapper
def fun1(a,b):
print('%s嘻嘻哈哈,%s也跟着嘻嘻哈哈' %(a,b))

三、带返回值的装饰器

 def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
time.sleep(0.1)
ret = f(*args,**kwargs)
end_time = time.time()
print('----> 执行效率%s' % (end_time - start_time))
return ret
return inner @wrapper
def fun(a):
s = "%s嘻嘻哈哈" %(a)
return s print(name)

总结:就是   我们调用 fun() 方法,实现原来的功能,并且增加新的功能,前提不能修改源代码。

17_Python装饰器的更多相关文章

  1. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  2. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  3. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  4. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  5. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  6. python cookbook 学习系列(一) python中的装饰器

    简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...

  7. python基础补漏-05-生成器和装饰器

    [1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...

  8. python --> 递归 以及装饰器

    一.递归知识 函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数. 递归在斐波那契数列的应用[斐波那契数列特点:前两个数 ...

  9. python 装饰器的理解

    一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...

随机推荐

  1. meterpreter_paranoid_mode.sh允许用户安全上演/无级连接Meterpreter经检查合格证书的处理程序正在连接到

    刚刚看完即刻安全大咖的新姿势感觉很6逼,结果成功了meterpreter_paranoid_mode.sh允许用户安全上演/无级连接Meterpreter经检查合格证书的处理程序正在连接到. 我们开始 ...

  2. ThinkPHP基础知识

    1.入口文件中定义的内容 // 检测PHP环境if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 ! ...

  3. Spark_总结一

    Spark_总结一 1.Spark介绍     1.1什么是Spark?     Apache Spark是一个开源的集群计算框架,使数据计算更快(高效运行,快速开发)          1.2Spa ...

  4. dedecms 封面模板和列表模板有什么不同

    封面模板,相当于你一个大栏目的封面.举例:你有一个栏目叫做"建站"而下面有很多子栏目,例如代码教程.模板下载.seo经验等,那么封面就相当于这个大栏目的首页,然后您可以在这个页面展 ...

  5. 用dedecms做网站时,空间服务器选择IIS还是apache???

    想做一个dedecms程序的网站,不知道要选择什么样的空间,windows还是linux的?多大的空间比较适合?求高人回答.   如果是基于Linux平台的话,那不必多说自然是Apache了,因为II ...

  6. electron 学习笔记

    一.快速搭建一个electron 项目结构 # 克隆示例项目的仓库 $ git clone https://github.com/electron/electron-quick-start # 进入这 ...

  7. 什么是A记录  域名

    A (Address) 记录是用来指定主机名(或域名)对应的IP地址记录.用户可以将该域名下的网站服务器指向到自己的web server,FTP server等上面.同时也可以设置域名的子域名. 通俗 ...

  8. win7 64位wamp2.5无法启动MSVCR110.DLL丢失听语音

    从网上下载wampserver2.5 64位的PHP集成环境,根本无法使用,说是丢失了MSVCR110.DLL,然后再网上找了一大堆资料工具都无用,比如下微软的了vcredist_x64,重新卸载安装 ...

  9. HttpUrlConnection使用与总结

    /*     * URL请求的类别分为二类,GET与POST请求.二者的区别在于:      * a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,      ...

  10. 【开发技术】Java生成验证码

    Java生成验证码 为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码来阻止,虽然这个会影响用户体验,但为了避免一些问题很多网站都使用了验证码;今天下午参考文档弄了一个验证码,这里分享一下; ...