python 装饰器从放弃到玩转(中级)

前面我们说到装饰器的初步使用

需求一:

那我现在有个需求,原函数是这样的

def test1():

a = "test1"

time.sleep(3)

return  a

可以看到是有返回值的,可我们之前的装饰器,并没有处理原函数的返回值的逻辑,那么我现在怎么办,看代码

def record_time(func):

def warpper():

start_time = time.time()

a = func()

end_time = time.time()

print "总共用时:" + str(int(end_time) - int(start_time))

return a

return warpper

@record_time

def test1():

a = "test1"

time.sleep(3)

return a

r = test1()

print r

步骤解释:

  1. @record_time== test1=record_time(test1)=warpper
  2. r = test1()

    test1() == warpper()

    里面直接return了原test1函数的返回值

  3. r = 原test1的返回值

需求一:

def test1(name):

a = name

time.sleep(3)

return  a

def test2(name,age):

a = name

b = age

dict = {}

dict["name"] = a

dict["age"] = age

time.sleep(3)

return  dict

我现在的函数需要传值,并且每个函数可能传的参数不是固定的,要求记录函数的执行时间

请看实现的代码如下

def record_time(func):

def warpper(*args,**kwargs):

start_time = time.time()

a = func()

end_time = time.time()

return a

return warpper

@record_time

def test1(name):

a = name

time.sleep(3)

return  a

@record_time

def test2(name=name ,age=age):

a = name

b = age

dict = {}

dict["name"] = a

dict["age"] = age

time.sleep(3)

return  dict

r = test1("test01")

r1 = test2("test02",20)

print r,r1

解释:

  1. @record_time == test1 = record_time(test1) = warpper(前面忘讲了,这个就是warpper的内存地址)
  2. @record_time == test2 = record_time(test2) = warpper
  3. test1("test01")== warpper("test01"),而warpper函数可以允许你传入不固定参数*agrs(元祖)和关键字参数(**kwargs)
  4. warpper中执行了原来的test01和test02
  5. 返回各自的结果
时间: 2024-12-17 07:03:24

python 装饰器从放弃到玩转(中级)的相关文章

python 装饰器从放弃到玩转(初级)

装饰器是困扰我很久的问题,最近突然开窍,理解了装饰器的含义 执行过程以及原理 装饰器:(本质是函数,装饰其他函数,帮其他函数实现附加的功能) 器:代表函数 装饰:代表装饰这个函数 原则: 不能修改装饰的函数内部源代码 不能修改原来函数的调用方式 装饰器公式: 高阶函数+嵌套函数 == 装饰器 (这里不对高阶函数和嵌套函数做解释,请先了解什么叫做高阶函数和嵌套函数) 下面从一个简单的程序让你了解装饰器的含义 假如我现在有这么两个别人写的函数,我们这在联合开发,现在有个需求需要对这两个函数进行性能的

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条

Python装饰器的学习笔记(转载)

Python装饰器的学习笔记 2017-05-18 程序员共读 来自:标点符的<Python装饰器的学习笔记> 链接:http://www.biaodianfu.com/python-decorator.html 原文:http://stackoverflow.com/questions/739654/how-to-make-a-chain-of-function-decorators-in-python#answer-1594484 装饰器(decorator)是一种高级Python语法.可

转发对python装饰器的理解

[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文  http://blog.csdn.net/sxw3718401/article/details/39519587 主题 Python 最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是 AstralWind的一篇博文,以及Limodou的一篇文章.作为初学者,这两篇文章对新手有很大的帮助,但仍然有些不易理解的地方

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

python装饰器通俗易懂的解释!

python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说明一下: 小P闲来无事,随便翻看自己以前写的一些函数,忽然对一个最最最基础的函数起了兴趣: 1 def sum1(): 2 sum = 1 + 2 3 print(sum) 4 sum1() 此时小P想看看这个函数执行用了多长时间,所以写了几句代码插进去了: 1 import time 2 3 def

python装饰器1

第八步:让装饰器带 类 参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 # -*- coding:gbk -*- '''示例8: 装饰器带类参数''' class locker:     def __init__(self):         print("locker.__init__() should be not called.")   

Python装饰器由浅入深

装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们以装饰函数为例子介绍其用法.要理解在Python中装饰器的原理,需要一步一步来.本文尽量描述得浅显易懂,从最基础的内容讲起. (注:以下使用Python3.5.1环境) 一.Python的函数相关基础 第一,必须强调的是python是从上往下顺序执行的,而且碰到函数的定义代码块是不会立即执行它的,只

python 装饰器学习(decorator)

最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initial decorator" f() def __call__(self): print "call decorator" @decorator def fun(): print "in the fun" print "after " fun