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

    一、装饰器的定义

    装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

    装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

    简单版本的装饰器:

    #简单的装饰器
    def func():
        print('小明')
    def timmer(f):
        def inner():
            start_time = time.time()
            time.sleep(0.1)
            f()
            end_time = time.time()
            print('----> 执行效率%s' % (end_time - start_time))
        return inner
    func = timmer(func)  # inner
    func() # inner()
    简单版本的装饰器

    带语法糖版本的装饰器:

    语法糖 @
    def timmer(f):
        def inner():
            start_time = time.time()
            time.sleep(0.1)
            f()
            end_time = time.time()
            print('----> 执行效率%s' % (end_time - start_time))
        return inner
    @timmer  # func = timmer(func)
    def func():
        print('小明')
    func() # inner()
    带语法糖的装饰器

    带参数的装饰器:

    #带参数的装饰器
    def timmer(f):
        def inner(*args,**kwargs):
            start_time = time.time()
            time.sleep(0.1)
            f(*args,**kwargs)
            end_time = time.time()
            print('----> 执行效率%s' % (end_time - start_time))
        return inner
    @timmer  # func = timmer(func)
    def func(a):
        print('%s小明'%a)
    func('AAA')
    带参数的装饰器

    带返回值的装饰器:

    # 带返回值的装饰器
    def timmer(f):
        def inner(*args,**kwargs):
            start_time = time.time()
            time.sleep(0.1)
            ret = f(*args,**kwargs)  # 222
            end_time = time.time()
            print('----> 执行效率%s' % (end_time - start_time))
            return ret
        return inner
    @timmer  # func = timmer(func)
    def func(a):
        return 222
    print(func('小明'))
    带返回值的装饰器

    通用装饰器:

    #通用装饰器
    def wrapper(func):
        def inner(*args,**kwargs):
            '''执行函数前操作'''
            ret = func(*args,**kwargs)
            '''执行函数后的操作'''
            return ret
        return inner
    
    @wrapper
    def func():
        print(66)
    func()
    通用装饰器

    带开关的装饰器:

    import time
    flag = False
    def timmer_out(f):
        def timmer(func):
            def inner(*args,**kwargs):
                '''执行函数前操作'''
                if f:
                    start_time = time.time()
                    time.sleep(0.3)
                    ret = func(*args,**kwargs)
                    '''执行函数后操作'''
                    end_time = time.time()
                    print('执行效率%s'%(end_time - start_time))
                    return ret
                else:
                    ret = func(*args,**kwargs)
                    return ret
            return inner
        return timmer
    
    @timmer_out(flag)  # 1, timmer_out(flag)  返回 timmer  --->
    def f1():         # 2,  @timmer 就是你认识的装饰器 f1 = timmer(f1)
        print(666)
    @timmer_out(flag)  # f2 = timmer(f2)
    def f2():
        print(777)
    f1()
    f2()
    带开关的装饰器

    多个装饰器装饰一个函数:

    def wrapper1(func):  # func = f
        def inner1():
            print('wrapper1 ,before func')
            func()
            print('wrapper1 ,after func')
        return inner1
    
    def wrapper2(func):  # func = inner1
        def inner2():
            print('wrapper2 ,before func')
            func()
            print('wrapper2 ,after func')
        return inner2
    
    @wrapper2     # f = wrapper2(f)  里面的f == inner1   外面的f = inner2
    @wrapper1     # f = wrapper1(f)  返回inner1    f = inner1
    def f():
        print('in f')
    f()  # inner2()
    多个装饰器装饰一个函数
  • 相关阅读:
    Ubuntu18.04下cuda和cudnn安装
    NVIDIA显卡驱动安装
    ultraiso(软碟通)制作u盘启动盘
    [转载]如何根据相机的参数知道摄像机的内参数矩阵
    C++ Primer : 第十三章 : 拷贝控制之拷贝、赋值与销毁
    用栈操作实现队列的操作
    C++ Primer : 第十二章 : 文本查询程序
    C++ Primer : 第十二章 : 动态内存之allocator类
    C++ Primer : 第十二章 : 动态内存之动态数组
    C++ Primer : 第十二章 : 动态内存之unique_ptr和weak_ptr
  • 原文地址:https://www.cnblogs.com/Ming-Hui/p/8423192.html
Copyright © 2011-2022 走看看