美文网首页
Python装饰器

Python装饰器

作者: i_promise | 来源:发表于2018-03-21 13:58 被阅读13次

    不改变函数功能的调用方式下,完成了函数功能的扩展就是装饰器

    def a1(func):
        def inner():
            print('-------啊哈哈哈哈----')
            func()
        return inner
    
    @a1     #装饰器 方法一  @a1 等价于 y1 = a1(y1)
    def y1():
        print('-----y1----')
    
    def y2():
        print('------y2------')
    
    y2 = a1(y2) #装饰器 方法二
    y1()
    y2()
    
    7E3226F6-5591-4694-8335-ADD82D7F513E.png
    def b1(bb):
        def innerB():
            print('1')
            return '<b>' + bb() + '</b>'
        return innerB
    
    def c1(cc):
        def innerC():
            print('2')
            return '<i>' + cc() + '</i>'
        return innerC
    
    @b1
    @c1
    def test():
        print('3')
        return 'testtest'
    
    dddd = test()
    print(dddd)
    

    输出
    1
    2
    3
    <b><i>testtest</i></b>

    def d1(dd):
        print('1111')
        def innerD():
            print('222')
            dd()
        return innerD
    
    @d1 #只要python解释器执行到了这个代码,那么就会自动的进行装饰,而不是等到调用的时候才装饰
    def test():
        print('333')
    
    #在调用f1之前,已经进行装饰了
    test()
    

    不定长参数 装饰器

    def func(fun):
    
        def aa(*args, **kwargs):
            print('test------1--')
            fun(*args, **kwargs)
    
        return aa
    
    @func
    def test(a,b,c,d):
        print('a=%d---b=%d-----c=%d------d=%d'%(a,b,c,d))
    
    test(11,22,33,44)
    

    带返回值的函数进行饰器

    def func(fun):
    
        def aa():
            print('test------1--')
            return fun()
    
        return aa
    
    @func
    def test():
        return 'eeee'
    
    tt = test()
    print('test--------%s'%tt)
    

    通用的装饰器

    def func(fun):
        def aa(*args, **kwargs):
            print('-'*5+'🙄'+'-'*5)
            return fun(*args, **kwargs)
    
        return aa
    
    @func
    def test():
        return 'eeee'
    
    @func
    def test2():
        print('-------test2-----')
    
    @func
    def test3(a):
        print('-------test3---a=%d--'%a)
    
    tt = test()
    print('test--------%s'%tt)
    ttt = test2()
    print('test2--------%s'%ttt)
    
    test3(22)
    

    带有参数的装饰器

    def func_arg(arg):
        def func(fun):
            def aa():
                print('-'*5+'🙄'+'-'*5+'arg=%s'%arg)
                return fun()
            return aa
        return func
    # 1、先执行func_arg('hehe')函数,这个函数return的结果是func这个函数的引用
    # 2、@func
    # 3、使用@func对test进行装饰
    @func_arg('hehe')
    def test():
        print('test')
    
    test()
    

    相关文章

      网友评论

          本文标题:Python装饰器

          本文链接:https://www.haomeiwen.com/subject/sczcqftx.html