码迷,mamicode.com
首页 > 编程语言 > 详细

从零开始的Python学习Episode 11——装饰器

时间:2018-10-08 20:44:33      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:原函数   python学习   简单   else   time()   语法   star   定时   函数   

装饰器

 

装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象。

 

简单的装饰器

 1 import time
 2 
 3 def show_time(f):
 4     def inner():
 5         start = time.time()
 6         f()
 7         end = time.time()
 8         print(time: %s%(end-start))
 9     return inner
10 
11 @show_time
12 def fun1():
13     print(hello)
14     time.sleep(1)
15 
16 fun1()
#输出
#hello
#time: 1.000274896621704

其中@show_time的意思是 fun1 = showtime(fun1) ,作用是在执行原函数add()时,把执行的代码转为inner()函数中的代码。

 

带参数的被装饰函数

如果被装饰的函数带有参数则装饰函数要带上参数。

参数个数确定时:

 1 import time
 2 
 3 def show_time(f):
 4     def inner(a,b):
 5         start = time.time()
 6         f(a,b)
 7         end = time.time()
 8         print(time: %s%(end-start))
 9     return inner
10 
11 @show_time
12 def fun1(x,y):
13     print(x+y)
14     time.sleep(1)
15 
16 fun1(1,2)
#输出
#3
#time: 1.0007870197296143

 

参数个数不确定时:

 1 import time
 2 
 3 def show_time(f):
 4     def inner(*args,**kwargs):
 5         start = time.time()
 6         f(*args,**kwargs)
 7         end = time.time()
 8         print(time: %s%(end-start))
 9     return inner
10 
11 @show_time
12 def fun1(*args,**kwargs):
13     sum = 0
14     for i in args:
15         sum+=i
16     print(sum)
17     time.sleep(1)
18 
19 fun1(1,2,3,4,5)
#输出
#15
#time: 1.0009024143218994

 

带参数的装饰器

import time
def judge(flag = False):
    def show_time(f):
        def inner(*args,**kwargs):
            if flag == True:
                start = time.time()
                f(*args,**kwargs)
                end = time.time()
                print(time: %s%(end-start))
            else:
                f(*args, **kwargs)
        return inner
    return show_time

@judge(True)
def add(*args,**kwargs):
    sum = 0
    for i in args:
        sum+=i
    print(sum)
    time.sleep(1)

@judge()
def multiple(*args,**kwargs):
    sum = args[0]
    for i in args:
        sum*=i
    print(sum)
    time.sleep(1)

add(1,2,3,4,5)
multiple(1,2,3,4,5)
#输出
#15
#time: 1.0006871223449707
#120

装饰器的语法允许我们在调用时,提供其它参数,比如当@judge()参数为默认的False时,不输出消耗时间了,当@judge()参数为True时,输出了消耗时间。这样实际上是在原有的装饰器上再加了一层,当我 们使用@judge(‘True’)调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。

 

从零开始的Python学习Episode 11——装饰器

标签:原函数   python学习   简单   else   time()   语法   star   定时   函数   

原文地址:https://www.cnblogs.com/smilepup-hhr/p/9756438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!