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

装饰器

 

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

 

简单的装饰器

 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能够发现这一层的封装,并把参数传递到装饰器的环境中。

 

posted on 2018-10-08 19:39  微笑小狗  阅读(282)  评论(0编辑  收藏  举报

导航