zoukankan      html  css  js  c++  java
  • PYTHON-有参装饰器,无参装饰器,语法糖

    装饰器
    装饰器就是闭包函数的一种应用场景

    一 为何要用装饰器
    #开放封闭原则:对修改封闭,对扩展开放

    二 什么是装饰器
    装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
    强调装饰器的原则:
    1 不修改被装饰对象的源代码
    2 不修改被装饰对象的调用方式
    装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

    三 装饰器的使用
    1. 无参装饰器
    def 装饰器名字(func):
    def wrapper(*args,**kwargs):
    #func是被装饰的对象,这里可以写执行前的功能
    res=func(*args,**kwargs)
    # 这里可以写执行后的功能
    return res
    return wrapper

    @装饰器名字 #被装饰的函数名字 = 装饰器名字(被装饰的函数内存地址)
    def 被装饰的函数名字():
    pass

    2. 有参装饰器
    def 装饰器名字(参数1,参数2,...):
    def outter(func):
    def wrapper(*args,**kwargs):
    res=func(*args,**kwargs)
    return res
    return wrapper
    return outter
    @装饰器名字(值1,值2,...) #@outter
    def 被装饰的函数名字():
    pass


    3. 语法糖:在被装饰对象正上方单独一行写
    无参:@装饰器的名字
    有参:@装饰器的名字(arg1,arg2,...)

    @timmer # index=timmer(index)
    def index():
    pass

    @auth2(engine='file') # @名字 # index=名字(index)
    def index():
    pass


    叠加多个装饰器
    @deco1
    @deco2
    @deco3
    def index():
    pass
    解释语法的顺序:自下而上,deco3=》deco2=》deco1
    调用index()时才开始触发装饰器内部闭包函数的执行,闭包函数执行顺序是:自上而条,
    deco1.wrapper1=>deco2.wrapper2=>deco3.wrapper3


    wrapper.__name__=func.__name__ (函数名字赋值)
    wrapper.__doc__=func.__doc__ (注释的内用赋值#)



  • 相关阅读:
    子查询
    多表连接
    类型转换和其他函数
    亲测!Jquery2.0不支持IE8-了
    Sass结合Modernizr的使用方法
    子元素绝对定位撑不开父元素的解决方法
    ajax withCredentials在firefox下问题的解释
    记录遇到的IE8兼容性问题汇总
    对于requirejs AMD模块加载的理解
    requirejs 小结
  • 原文地址:https://www.cnblogs.com/du-jun/p/9767730.html
Copyright © 2011-2022 走看看