Python装饰器简单说明

装饰器?Python?这是一个特别难搞懂的东西,既然难,我们不从理论入门。我们从应用案例入手吧
我设计一个场景:
1.你有10个def方法,每个方法不同功能
2.你的任务是计算每个方法的运行时间
懂了吗!!!!》》》》 我们开始

from time import sleep,time

def timer(function): #建立装饰器函数,他就是你未来要套用的功能
    def wrap(): #建立一个关包,这里是装饰器 要给你装修的地方哦。
        start = time()  #这里是具体计算功能
        function()   #这里是调用被装饰的函数
        end = time()
        res = end-start
        return res #输出
    return wrap #注意这里是通过return在timer函数里调用wrap包


@timer #注意这里的timer就是上边定义装饰器函数的名字 ,下边跟的就是你要装饰的函数这里就是要被计算时间的函数
def test1():
    sleep(1)
    print ('test 1 DONE')

#OUT -》》》》test 1 DONE
#OUT -》》》》1.0003149509429932

@timer
def test2():
    sleep(2)
    print('test 2 DONE')
#OUT -》》》》test 2 DONE
#OUT -》》》》2.0004449509429932

还有一种情况 就是 比如我希望给 装饰器加一个形参数呢? 如何做?
因为我的这个要被检测的程序太多,我要给每个做一个id

from time import sleep,time

def maintimer(who): #这里看哈,多了一层 这一层就是给 装饰器做形参的哦
    def timer(function):
        def wrap():
            print ('i am from ',who)
            start = time()
            function()
            end = time()
            res=end-start
            return res
        return wrap    #注意这里是一个一个return回调执行
    return timer

@maintimer(' i am test3')
def test3():
    sleep(1)
    print ('test 3 DONE')
#OUT -》》》》i am from test3
#OUT -》》》》test 3 DONE
#OUT -》》》》1.0004449509429932

@maintimer('i am test4')
def test4():
    sleep(2)
    print('test 4 DONE')
#OUT -》》》》i am from test4
#OUT -》》》》test 4 DONE
#OUT -》》》》2.0004449509429932