zoukankan      html  css  js  c++  java
  • Python基础—装饰器(Day11)

    装饰器

    1.装饰器是在不改变原函数的执行的情况下为原函数增额外的功能。

    简单版装饰器
    import
    time def func1(): print('执行速度') def timmer(f): start_time=time.time() f() time.sleep(0.3) end_time=time.time() print('此函数的执行效率%s'% (end_time-start_time)) f1=func1 func1=timmer func1(f1)
    import time
    def timmer1(f): #f接收的是@timmer下面原函数的函数名func1
        def inner():
            f()
            start_time=time.time()
            time.sleep(0.3)
            end_time=time.time()
            print('此函数的执行效率%s' % (end_time - start_time))
        return inner
    
    @timmer1
    def func1():
        print('测试速度')
    
    func1()
    
    执行结果:
    测试速度
    此函数的执行效率0.30037736892700195

     2.被装饰函数带参数的装饰器

    # import time
    # def timmer(f):#f=func1=inner
    #     def inner(*args,**kwargs):
    #         start_time=time.time()
    #         f(*args,**kwargs)  #func1((*args,**kwargs))
    #         time.sleep(0.3)
    #         end_time=time.time()
    #         print('此函数的执行效率%s'% (end_time-start_time))
    #     return inner
    # @timmer
    # def func1(a,b,c,d): #timmer(func1)
    #     print(a,b,c,d)
    #     print('测试效率')
    # func1(1,2,3,4)

    3.装饰器模版

    def wrapper(func):
        def inner(*args,**kwargs):
            ret=func(*args,**kwargs)
            return ret
        return inner
    
    @wrapper
    def func(a,b):
        print(666)
    func(1,2,3)

     4.带参数的装饰器

    import time
    def timmer(*args,**kwargs):
        def wrapper(f):
            def inner(*args,**kwargs):
                if flag:
                    start_time=time.time()
                    ret=f(*args,**kwargs)
                    time.sleep(0.3)
                    end_time=time.time()
                    print('此函数的执行效率%f' %(end_time-start_time))
                else:
                    ret=f(*args,**kwargs)
                return ret
            return inner
        return wrapper
    flag=True  #flag=False 关掉装饰器
    @timmer(flag) # 两步:1.把timmer(flag)当成一个普通话函数传给def timmer(),返回wrapper 2.变成@wrapper装饰器
    def func1():
        print(666)
    func1()
    
    执行结果:
    666
    此函数的执行效率0.300240

     5.多个装饰器

    def wrapper1(func):# func=f=inner1
        def inner1():
            print('wrapper1,before func') #2
            func()
            print('wrapper1,after func') #3
        return inner1
    def wrapper2(func): # func=inner1=inner2
        def inner2():
            print('wrapper2,before func') #1
            func()
            print('wrapper2,after func') #4
        return inner2
    @wrapper2 #  f = wrapper2(f)  里面的f==inner1  外面的f == inner2
    @wrapper1 # f = wrapper1(f)   里面的f==函数名f  外面的f == inner1
    def f():# f=inner1
        print('in f')
    f() #f=inner1=inner2
    
    执行结果:
    wrapper2,before func
    wrapper1,before func
    in f
    wrapper1,after func
    wrapper2,after func
  • 相关阅读:
    题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
    冒泡排序、插入排序、快速排序
    去掉字符串中重复的字符
    建立一个带附加头结点的单链表.实现测长/打印/删除结点/插入结点/逆置/查找中间节点/查找倒数第k个节点/判断是否有环
    day_1 练习2
    python-day 练习1
    python课程第一天笔记-la
    初学react,为什么页面不显示
    跟我一起学写插件开发
    网上下载的带特效的jquery插件怎么用
  • 原文地址:https://www.cnblogs.com/facestore/p/8678840.html
Copyright © 2011-2022 走看看