• Python—装饰器


    装饰器

    1.普通函数

    #简单的函数和调用
    def a1():
        print("i am zhangsan")
    def a2():
        print("i am lisi")
    a1()
    a2()

    2.在函数前后添加功能

    def inner(func):
        print("添加1")
        func()
        print("添加2")
        return func
    def a1():
        print("i am zhangsan")
    def a2():
        print("i am zhangsan")
    
    a1=inner(a1)
    a1()
    a2=inner(a2)
    a2()

    3.使用装饰器

    def mywork(func):
        def inner():
            print("添加1")
            func()
            print("添加2")
        return inner
    @mywork     # @mywork就等于a1=mywork(a1)
    def a1():
        print("i am zhangsan")
    
    a1()
    #执行时@mywork会把他下面的函数当成mywork函数的参数既mywork(a1),然后在函数inner里执行,inner内func()=a1()

    4.装饰带参数的函数

    def mywork(func):
        def inner(arg):
            print("添加1")
            func(arg)
            print("添加2")
        return inner
    @mywork
    def a1(arg):
        print 'i am zhangsan',arg
    
    a1("参数1")

    5.装饰动态参数的函数

    #合并无参,有参,多参  可以装饰含有N个参数的函数
    def mywork(func):
        def inner(*args,**kwargs):
            print("添加1")
            func(*args,**kwargs)
            print("添加2")
        return inner
    @mywork
    def a1():
        print 'i am zhangsan'
    @mywork
    def a2(arg):
        print 'i am zhangsan',arg
    @mywork
    def a3(arg1,arg2):
        print 'i am zhangsan',arg1,arg2
    a1()
    a2("参数1")
    a3("参数1","参数2")

    6.装饰含有返回值的函数

    #装饰含有返回值的函数
    def mywork(func):
        def inner(*args,**kwargs):
            print("添加1")
            aa=func(*args,**kwargs)
            print("添加2")
            return aa
        return inner
    @mywork
    def a3(arg1,arg2):
        print 'i am zhangsan',arg1,arg2
        li=[1,2,3,4,5,6]
        return li   #返回一个列表
    
    list=a3("参数1","参数2")    #list等于inner的返回值
    print(list)
    #li列表是a3的返回值,所以给在inner函数里执行的func()赋给aa,在通过inner的返回值就能拿到列表

    7.装饰器实现登录验证简单原理

    def login():
        name =raw_input("输入用户名:")
        if name == "zhangsan":
            return  True
        else:
            return False
    def mywork(func):
        def inner(*args,**kwargs):
            lo_login = login()
            if not lo_login:    #如果login()返回的是False
                return "用户名错误!"
            aa=func(*args,**kwargs)
            return aa
        return inner
    @mywork
    def a3(arg1,arg2):
        print 'i am zhangsan',arg1,arg2
        li=[1,2,3,4,5,6]
        return li
    list=a3("参数1","参数2")    #list等于inner的返回值
    print(list)
    View Code

    8.多个装饰器装饰一个函数

    def newwork1(func):
        def inner():
            print("newwork1前")
            func()
            print("newwork1后")
        return inner
    def newwork2(func):
        def inner():
            print("newwork2前")
            func()
            print("newwork2后")
        return inner
    
    @newwork2
    @newwork1
    def f1():
        print 'i am zhangsan'
    f1()
    '''
    输出结果:
        newwork1前
        newwork2前
        i am zhangsan
        newwork2后
        newwork1后
    '''
    View Code

    9.装饰器加参数

    #3层装饰器
    def Filter(a1,a2):
        def outer(func):
            def wrapper(request,kargs):
                print(a1)
                result=func(request,kargs)
                print(a2)
                return result
            return wrapper
        return  outer
    aa=11
    bb=22
    @Filter(aa,bb)
    def Index(request,kargs):
        print request,kargs
    
    Index("zhangsan","lisi")
    #@Filter(aa,bb)会先执行Filter(aa,bb)函数,获取到返回值outer后拼接成@outer,之后就变成普通的装饰器了
    #wrapper函数内可以使用a1,a2,request,kargs 4个参数
  • 相关阅读:
    园 首页 新随笔 联系 管理 订阅 订阅 RTSP协议转换RTMP直播协议
    sequence diagram
    Model Binding
    asp.net mvc
    系统日志和异常的处理①
    随机森林之oob error 估计
    Extjs相关知识点梳理
    Extjs报错处理
    webbrowser在html中写入内容并添加js
    tcpdump一个命令的剖析
  • 原文地址:https://www.cnblogs.com/melonjiang/p/5096759.html
Copyright © 2020-2023  润新知