python 修饰器

发布时间:2019-08-14 12:48:22编辑:auto阅读(24)

    因困扰自己多时,打算整理一下修饰器到底是什么?
    参考资料:http://python.jobbole.com/82344/
    
    修饰器
    1. 定义2个函数
    2. 基本实现
    3. 问题:实现后, 要修改原来代码中的变量名, funcB()改为funcA(funcB)
    4. 解决方法:让funcB赋值等于funcA(funcB),用时就是funcB(), 不用修改原来代码, 这个要求需funcA(funcB)返回的是一个函数
        a) 所以要返回一个函数,则加一个函数 wrapper(),然后return 函数; 将原来代码写进wrapper(),方便多次调用
    5. python的语法糖@, funcB = funcA(funcB),@funcA, 简写代码, 注意写对位置,写在要funcB()的前面
    
    基本实现
    def funcA(func):
        print('这是11111111')
        funcB_copy = func()
        return funcB_copy
    
    def funcB():
        print('这是2222222222')
    
    funcA(funcB)
    funcB()
    
    
    # 1. 问题:实现后, 要修改原来代码中的变量名, funcB()改为funcA(funcB)
    # 2. 解决方法:让funcB赋值等于funcA(funcB),用时就是funcB(), 不用修改原来代码, 这个要求需funcA(funcB)返回的是一个函数
    #     所以要返回一个函数,则加一个函数 wrapper(),然后return 函数; 将原来代码写进wrapper(),方便多次调用
    
    def funcA(func):
        def wrapper():
            print('这是11111111')
            funcB_copy = func()
            return funcB_copy
        return wrapper
    
    def funcB():
        print('这是2222222222')
    
    
    funcB = funcA(funcB) #这是func2 = wrapper()函数
    funcA() #func2()执行的是wrapper()
    
    最后python的语法糖@, 将funcB = funcA(funcB)改为 @funcA,简写代码, 注意写对位置,写在funcB()的前面
    def funcA(func):
        def wrapper():
            print('这是11111111')
            funcB_copy = func()
            return funcB_copy
        return wrapper
    
    @funcA
    def funcB():
        print('这是2222222222')
    
    funcB()
    
    
    # 原来是带参数函数
    def funcA(func):
        def wrapper(a, b): # 注意这里
            print('这是11111111')
            funcB_copy = func(a, b) #注意这里
            return funcB_copy
        return wrapper
    
    @funcA
    def funcB(a, b):
        print('这是2222222222')
        print(a, b)
    
    funcB()
    
    基本调试几遍就会了
    ps:参考资料写的更好
    
    这篇文章不是转载,内容也不是原创,我也不知道选什么(只有原创、转载、翻译), 是参考文章的自己理解版,暂时标为原创,如有不妥请告诉我


关键字

上一篇: 编译安装python

下一篇: Python -- 异常处理