美文网首页
python3基础---详解装饰器

python3基础---详解装饰器

作者: HopCoder | 来源:发表于2017-09-12 13:28 被阅读0次

    1、装饰器原理

    def w1(func):
        def inner():
            print('---正在验证权限----')
            func()
        return inner
    def f1():
        print('-----f1-----')
    
    def f2():
        print('----f2-----')
    
    #innerfunc = w1(f1)
    #innerfunc()
    
    f1 = w1(f1)
    f1()      
    

    2、装饰器语法

    def w1(func):
        def inner():
            print('---正在验证权限----')
            func()
        return inner
    
    @w1 #在func代表的函数身上添加@
    def f1():
        print('-----f1-----')
    
    def f2():
        print('----f2-----')
    
    f1()
    

    3、装饰器执行的时间

    装饰器在Python解释器执行的时候,就会进行自动装饰,并不是在在执行的时候才进行装饰

    4、两个装饰器

    def w1(func):
        print('---正在装饰 1----')
        def inner():
            print('---正在验证权限 1----')
            func()
        return inner
    
    def w2(func):
        print('---正在装饰 2----')
        def inner():
            print('---正在验证权限 2----')
            func()
        return inner
    
    @w1 #f1 = w1(f1)
    @w2 #f1 = w2(f1)
    def f1():
        print('-----f1-----')
    
    #在调用f1之前,已经进行了装饰
    f1()
    

    说明:
    如果不调用f1,直接编译,打印结果是:

    ---正在装饰 2----
    ---正在装饰 1----
    

    如果调用f1,打印结果是

    ---正在装饰 2----
    ---正在装饰 1----
    ---正在验证权限 1----
    ---正在验证权限 2----
    -----f1-----
    

    理解:

    @w1 #f1 = w1(f1)
    @w2 #f1 = w2(f1)
    def f1():
    

    当解释器程序执行这个的时候,先碰到@w1所以判断下面是否是def函数,发现下面是@w2,所以继续执行,当碰到def f1()的时候,找到要装饰的目标函数,所以先用w2对目标进行装饰,然后用w1对目标函数进行装饰

    5、装饰器对有参和无参的函数进行装饰

    1、有参

    def func(funNume):
        def func_in(aa,bb):
            funNume(aa,bb)
        return  func_in
    
    @func
    def f1(a,b):
        print("------ppppp-----")
        
    f1(11,12)
    

    2、对有返回值的函数进行装饰

    def func(funNume):
        def func_in(aa,bb):
            return funNume(aa,bb)
    
        return  func_in
    
    @func
    def f1(a,b):
        print("------ppppp-----")
        return ‘haha’
        
    f1(11,12)
    

    6 、通用装饰器

    def func(funNume):
        def func_in(*args,**kargs):
            return funNume(*args,**kargs)
        return  func_in
    
    @func
    def f1(a,b):
        print("------f1-----")
        return 'haha'
    
    @func
    def f2():
        print("----f2-----")
    
    @func
    def f3(a):
        print("----f3-----")
    #说明:*args,**kargs是不定参数
    

    7、带参数的装饰器

    def func_arg(arg = 'hello'):
        def func(funNume):
            def func_in(*args,**kargs):
                return funNume(*args,**kargs)
            return  func_in
        return func
    
    #1.先执行func_arg('world')函数,这个函数return的结果是func这个函数的引用
    #2.@func
    #3.使用@func对f1进行装饰
    @func_arg('world')
    def f1(a,b):
        print("------f1-----")
        return 'haha'
    

    相关文章

      网友评论

          本文标题:python3基础---详解装饰器

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