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

  • 相关阅读:
    校赛writeup
    memory-300——Jarvis OJ
    校赛_warmup_pwn
    sctf
    iscc-pwn1
    level3-64——Jarvis OJ
    JarvisOJ——level2
    JarvisOJ——guestbook
    Javris oj——level0
    linux 服务器 tomcat环境部署出错 重启
  • 原文地址:https://www.cnblogs.com/smilepup-hhr/p/9756438.html
Copyright © 2020-2023  润新知