python装饰器

Posted 雾霾1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python装饰器相关的知识,希望对你有一定的参考价值。

一.开闭原则

  对功能拓展的开放

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

二.装饰器

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

   2.意义:

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

   3.通用装饰器的写法:

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  

  

 

以上是关于python装饰器的主要内容,如果未能解决你的问题,请参考以下文章

[TimLinux] Python 装饰器

python装饰器

python装饰器关键代码

Python装饰器

python之装饰器

python 装饰器