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

    一.开闭原则

      对功能拓展的开放

        对代码修改的封闭           可以更好的维护和开发

    二.装饰器

      1.个人理解:装饰器就是把原来需要修改的函数修改好,重新给赋值(赋值成原来的名字).名字一样功能增加,但是只能在之前或者之后加功能

       2.意义:

        在不破坏原有函数和原有函数调用的基础上,给函数添加新功能(python里的动态代理)

       3.通用装饰器的写法:

      如果需要装饰的函数(方法)在类中,需要在传入参数时第一个位置加上self

    def warrper(fn):      # 调用目标函数
        def inner(*args,**kwargs):          # 在inner里加功能  接收到的是元组
            """在调用函数之前加入功能"""
            ret = fn(*args,**kwargs)     # ret 是接收目标函数的返回值   打散传给形参
            """在调用函数之后加入功能"""
            return ret     # 返回调用的目标函数返回值 保证函数正常结束
        return inner
    
    @warrper       # 语法糖,等价于 target_fn = warrper(target_fn) 
    def target_fn():
        pass

    三.带参的装饰器

      1.带参的装饰器就是给装饰器加个开关,参数就是开关.

       2.带参装饰器写法:

    def warrper_out(flag):    # 装饰器本身的参数
        def warrper(fn):     #目标函数
            def inner(*args,**kwargs):
                if flag == True:
                    print("问问行情")
                    ret = fn(*args,**kwargs)
                    print("骗人")
                    return ret
                else:
                    ret = fn(*args, **kwargs)
                    return ret
            return inner
        return warrper
    
    @warrper_out(True)     # 语法糖   @装饰器
    def yue():
        print("走 约")
    
    yue()

    四.多个装饰器修饰同一个函数

      多个装饰器修饰同一个函数取就近  一层一层

    # def warpper0(fn):
    #     def inner(*args,**kwargs):
    #         print("111")
    #         ret = fn(*args,**kwargs)
    #         print("222")
    #         return ret
    #     return inner
    #
    # def warpper1(fn):
    #     def inner(*args,**kwargs):
    #         print("333")
    #         ret = fn(*args,**kwargs)
    #         print("444")
    #         return ret
    #     return inner
    #
    # def warpper2(fn):
    #     def inner(*args,**kwargs):
    #         print("555")
    #         ret = fn(*args,**kwargs)
    #         print("666")
    #         return ret
    #     return inner
    #
    #
    #
    # @warpper0     # 折返
    # @warpper1
    # @warpper2
    # def func():
    #     print("我是func")
    #
    # func()   # 0 1 2 func 2 1 0     先用2装饰 再用1 再用0  
    

      

  • 相关阅读:
    今天晚上有个什么样的博文呢
    STM8CubeMx来了
    开博啦
    Authentication
    文件上传设计要点
    分布式杂记
    SQL Server 知识集
    C# 集合使用误区
    网络知识集
    关于 elasticsearch 近实时特征的思考
  • 原文地址:https://www.cnblogs.com/q767498226/p/10121381.html
Copyright © 2011-2022 走看看