zoukankan      html  css  js  c++  java
  • Python装饰器的进阶

    带参数的装饰器

    示例一:Python自带的装饰器函数

    from functools import wraps
    import time
    def Time(func1):
        @wraps(func1)
        def Wrapper(*args,**kwargs):
            start = time.time()
            ret = func1(args)
            end = time.time()
            print(end - start)
            return ret
        return Wrapper
    
    
    def func1(day):
        time.sleep(0.5)
        '''好嗨呦'''
        print('放假%s天'%day)
        return '好开心'
    
    func1 = Time(func1)
    ret = func1(10)
    print(func1.__name__)
    # 打印函数的名字
    print(func1.__doc__)
    # 打印函数中注释部分内容;不过我用的python 3.5 ,__doc__这个内置函数好像并未生效,老男孩的代码也没有生效,下次注意研究

    示例二:装饰器带参数的使用(三层嵌套)

    import time
    Conditions = True
    # 在已经写好的装饰器中要对装饰器做参数判断,可以使用三层嵌套来完成,在嵌套外部定义一个判断值;这样就不用改动后续代码,只需要改动判断值即可;
    def Time_out(Conditions):
        def Time(func1):
            def inner(*args,**kwargs):
                if Conditions:
                    start = time.time()
                    ret = func1(*args,**kwargs)
                    end = time.time()
                    print(end - start)
                    return ret
                else:
                    ret = func1(*args,**kwargs)
                    return ret
            return inner
        return Time
    Time = Time_out(Conditions)
    
    @Time
    def fun1():
        time.sleep(0.5)
        print('func1')
    
    @Time
    def fun2():
        print('func2')
        time.sleep(0.5)
    fun1()
    fun2()

    多个装饰器装饰一个函数

    def wrapper1(func):
        def inner1():
            print('wrapper1 ,before func')
            ret = func()
            print('wrapper1 ,after func')
            return ret
        return inner1
    
    def wrapper2(func):
        def inner2():
            print('wrapper2 ,before func')
            ret = func()
            print('wrapper2 ,after func')
            return ret
        return inner2
    
    def wrapper3(func):
        def inner3():
            print('wrapper3 ,before func')
            ret = func()
            print('wrapper3 ,after func')
            return ret
        return inner3
    
    @wrapper3
    @wrapper2
    @wrapper1
    def f():
        print('in f')
        return '哈哈哈'
    
    print(f())

    注意事项

    • @装饰器名称,装饰器名称会被当成执行内容先执行,'@装饰器'这个东西要查分成两部分看
    • 一定要记住装饰器的在执行过程中的先后顺序
  • 相关阅读:
    为什么要用do-while(0)?
    网络字节序&大小端存储
    sql语句w3school教程
    C++编码规范
    std::deque双端队列介绍
    gdb基本操作
    gdb调试多线程
    数据库基础
    删除vector所有元素
    stl迭代器失效
  • 原文地址:https://www.cnblogs.com/guge-94/p/10504904.html
Copyright © 2011-2022 走看看