什么是装饰器

装饰器本身就是函数,并且为其他函数添加附加功能

装饰器的原则:1.不修改被装饰对象的源代码  2.不修改被装饰对象的调用方式
装饰器=高阶函数+函数嵌套+闭包

# res=timmer(test)  #返回的是wrapper的地址 # res()  #执行的是wrapper()

# test=timmer(test)  #返回的是wrapper的地址 # test()  #执行的是wrapper()

#  @timmer  就相当于 test=timmer(test)

# #搭一个高阶函数与函数嵌套的框架
# def timmer(func):
# def wrapper():
# print(func)
# func()
# return wrapper
import time
def timmer(func):
def wrapper():
start_time=time.time()
# print(func)
res=func()#由于执行新获得的test,所以执行wrapper,func作为局部变量,当前没有,便往上一层去找,即test,运行test
stop_time = time.time()
print('运行时间是%s' %(stop_time -start_time))
#wrapper里没有返回值,所以不管怎么改变test,返回值都是none
return res#由于func运行的就是test,所以将func的值赋给res,再返回res就是test的返回值
return wrapper
@timmer#相当于test = timmer(test)#把test函数作为参数传给timmer,执行timmer获取到返回值wrapper,并将其赋给test
def test():
time.sleep(3)
print('test运行完毕')
return '这是test的返回值' test()#执行新的test,实际就是执行wrapper,这是为了不改变test的调用方式

Python进阶【第九篇】装饰器的更多相关文章

  1. Python进阶之decorator装饰器

    decorator装饰器 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...

  2. Python 进阶_闭包 & 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  3. Python进阶-III 函数装饰器(Wrapper)

    1.引入场景: 检查代码的运行时间 import time def func(): start = time.time() time.sleep(0.12) print('看看我运行了多长时间!') ...

  4. Python入门篇-装饰器

    Python入门篇-装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.装饰器概述 装饰器(无参) 它是一个函数 函数作为它的形参 返回值也是一个函数 可以使用@functi ...

  5. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  6. python函数与方法装饰器

    之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...

  7. Python 入门之 Python三大器 之 装饰器

    Python 入门之 Python三大器 之 装饰器 1.开放封闭原则: (1)代码扩展进行开放 ​ 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代 ...

  8. python语法基础-函数-装饰器-长期维护

    ######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...

  9. guxh的python笔记三:装饰器

    1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...

  10. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

随机推荐

  1. RN-android 打包后,部分图片不显示

    安卓打包后以及真机调试的时候部分图片不显示,原因是 安卓的包文件并不会每次都把图片资源重新打包.也就是说,你第一次打完包之后,再更新图片与代码,代码是会生效,但是图片文件是拿不到的,解决办法是 ../ ...

  2. ES6的export与Nodejs的module.exports

    原文:https://www.cnblogs.com/lxg0/p/7774094.html module.exports与exports,export与export default之间的关系和区别 ...

  3. 158A

    #include <iostream> #include <algorithm> using namespace std; int main() { int groups[10 ...

  4. 块结构在文件中的表示IOB【转载】

    转自:http://www.coderjie.com/blog/43b3601e0a2411e7841d00163e0c0e36 1.块在内存中以树的形式存储,分好块的文本在文件中用IOB标记存储: ...

  5. [LeetCode] 661. Image Smoother_Easy

    Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother t ...

  6. Window.sessionStorage - Web API 接口参考 | MDN

    参考:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/sessionStorage sessionStorage 属性允许你访问一个 s ...

  7. node.js初识08

    1.模块的概念,在前端的世界里,jq和js的关系,在后台里就是express和原生node的关系, 2.每一个js里的函数都只在当前文件里起作用,如果你希望在其他js里调用这个函数,这么你需要在这个j ...

  8. WebSocket.之.基础入门-建立连接

    WebSocket.之.基础入门-建立连接 1. 使用开发工具(STS.Eclipse等)创建web项目.如下图所示,啥东西都没有.一个新的web项目. 2. 创建java类.index.jsp页面. ...

  9. redis基本命令

    1指定配置文件启动 ./redis-server /opt/server/redis/conf/redis.conf vim redis.conf #配置文件requirepass    #后面跟密码 ...

  10. sudo安装某一文件报错:E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?

    报错原因:资源被占用 解决方法: sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock