当前位置: 移动技术网 > IT编程>脚本编程>Python > 从零开始的Python学习Episode 11——装饰器

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

2018年10月08日  | 移动技术网IT编程  | 我要评论

025新闻网,夏锦文 警告处分,3u8892

装饰器

 

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

 

简单的装饰器

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网