python装饰器详解

2018-12-06 07:35:27来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

# -*- coding:utf-8 -*-
import time
#作者:    baikai  
#创建时间: 2018/12/4 13:22 
#文件:    demo.py  
#IDE:    PyCharm
#装饰器
#1:不能修改被装饰的函数的源代码
#2:不能够改变被装饰函数的调用方式
#应用场景:插入日志、性能测试、处理事务
#需求测试一个函数大概运行多少时间

def f():
    print('I am f')
    time.sleep(2)

def new_f():
    start_time=time.time()
    f()
    end_time=time.time()
    print('耗时:%s'%(end_time-start_time))

if __name__ == '__main__':
    new_f()

 

#理解装饰器之前,还需要理解3句话
#1.函数即变量
#函数也可以作为参数,函数也可以作为返回值
#2.高阶函数
#以函数作为参数,或者返回值是函数的函数
#3.函数嵌套
#函数里面定义函数
#高阶函数+嵌套函数=装饰器

def my_time(func):
    def wrapper():
        start_time=time.time()
        func()
        end_time=time.time()
        print('%s耗时%s秒' % (func.__name__,(end_time-start_time)))
    #不加()是返回该函数,加()是返回该函数的结果
    return wrapper

def f():
    print('I am f')
    time.sleep(2)

n=my_time(f) #n等于wrapper
f=n
f()

 

# -*- coding:utf-8 -*-
import time
#作者:    baikai  
#创建时间: 2018/12/4 13:22 
#文件:    demo.py  
#IDE:    PyCharm
#装饰器
#1:不能修改被装饰的函数的源代码
#2:不能够改变被装饰函数的调用方式
#应用场景:插入日志、性能测试、处理事务
#需求测试一个函数大概运行多少时间
#定义一个装饰器
def my_time(func):
    def wrapper():
        start_time=time.time()
        # func就是f()这个函数,而f()相当于wrapper()这个函数
        #所以func()最终就是等于执行wrapper()这个函数
        func()
        end_time=time.time()
        print('%s耗时%s秒' % (func.__name__,(end_time-start_time)))
    #不加()是返回该函数,加()是返回该函数的结果
    return wrapper

@my_time #等于f=my_time(f),执行my_time(f),返回了wrapper这个函数
def f():
    print('I am f')
    time.sleep(2)

f() #执行f()就相当于执行wrapper()这个函数

 

执行结果如下:

I am f
f耗时2.0秒

Process finished with exit code 0

 

有参装饰器

# -*- coding:utf-8 -*-
import time
#作者:    baikai  
#创建时间: 2018/12/4 13:22 
#文件:    demo.py  
#IDE:    PyCharm
#装饰器
#1:不能修改被装饰的函数的源代码
#2:不能够改变被装饰函数的调用方式
#应用场景:插入日志、性能测试、处理事务
#需求测试一个函数大概运行多少时间
#定义一个有参装饰器
def my_time(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        # func就是f()这个函数,而f()相当于wrapper()这个函数
        #所以func()最终就是等于执行wrapper()这个函数
        func(*args,**kwargs)
        end_time=time.time()
        print('%s耗时%s秒' % (func.__name__,(end_time-start_time)))
    #不加()是返回该函数,加()是返回该函数的结果
    return wrapper

@my_time #等于f=my_time(f),执行my_time(f),返回了wrapper这个函数
def f():
    print('I am f')
    time.sleep(2)

#有参函数
@my_time
def f1(name):
    print(name)

f() #执行f()就相当于执行wrapper()这个函数

f1('baikai')

这样有参函数和无参函数都可以被装饰了

运行结果如下:

I am f
f耗时2.0秒
baikai
f1耗时0.0秒

Process finished with exit code 0

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Python循环与判断

下一篇:2.Twisted学习