zoukankan      html  css  js  c++  java
  • python基础十一之装饰器进阶

      函数的双下划线方法

    def hahahha():
        """测试函数"""
        print('zxc')
    print(hahahha.__name__)   # 打印函数的名字
    print(hahahha.__doc__)   # 打印函数中的注释

      wraps

      被装饰函数的名字在使用装饰器后名字对应的内存地址会发生变化,通过__name__打印的名字将不再是函数自身的名字,为了解决这个问题,就要用wraps

    from functools import wraps
    def func(fun):
        @wraps(fun)   # 使被装饰的函数的名字不发生变化
        def inner(*args, **kwargs):
            print('前面功能')
            ret = fun(*args, **kwargs)
            print('后面功能')
            return ret
        return inner
    @func
    def out():
        print('zxc')
    print(out.__name__)

        

      带参数的装饰器

    # 带参数的装饰器
    import time
    # FLAG = True
    FLAG = False
    
    
    def timmer_out(flag):
        def timmer(func):
            def inner(*args, **kwargs):
                if flag:
                    start = time.time()
                    ret = func(*args, **kwargs)
                    end = time.time()
                    print(end-start)
                    return ret
                else:
                    ret = func(*args, **kwargs)
                    return ret
            return inner
        return timmer
    
    # timmer_out(FLAG) 相当于timmer 所以@timmer_out(FLAG)就相当于@timmer
    
    
    @timmer_out(FLAG)
    def test():
        time.sleep(1)
        print('zxc')
    
    
    @timmer_out(FLAG)
    def test1():
        time.sleep(1)
        print('zxf')
    
    test()
    test1()
    View Code

      

      多个装饰器装饰一个函数

    # 多个装饰器装饰一个函数
    
    
    def wrapper1(f):
        def innner():
            print('wrapper1装饰的func之前')
            f()
            print('wrapper1装饰的func之后')
        return innner
    
    
    def wrapper2(f):
        def innner():
            print('wrapper2装饰的func之前')
            f()
            print('wrapper2装饰的func之后')
        return innner
    
    
    @wrapper2
    @wrapper1
    def func():
        print('func')
    func()
  • 相关阅读:
    Oracle的分区打点
    学习Struts2经验总结
    优化MVC,实现数据库表的记录的添加、删除、修改、查询。
    基于struts研究传值问题
    基于“MVC”框架集设计模式,开发用户管理系统!
    使用Struts,实现简单的登录
    QT学习4:使用窗口部件
    QT学习9:绘制函数
    QT学习8:准备战斗
    QT学习6:组装丰富的积木!
  • 原文地址:https://www.cnblogs.com/zxc-Weblog/p/8145359.html
Copyright © 2011-2022 走看看