• 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  
    

      

  • 相关阅读:
    leetcode Move Zeroes
    leetcode Same Tree
    leetcode range sum query
    leetcode Invert Binary Tree
    leetcode【sql】 Delete Duplicate Emails
    mac编译PHP报错 configure: error: Please reinstall the libcurl distribution
    Linux添加系统环境变量的两种方法
    Mysql获取去重后的总数
    MySQL查询order by相减select相减的Sql语句
    修改maven本地仓库路径
  • 原文地址:https://www.cnblogs.com/q767498226/p/10121381.html
Copyright © 2020-2023  润新知