python 装饰器

装饰器用法

代码演示:

import time

#-----------------下面是要修饰的函数带参数的写法---------------
def deco_1(func): #第一个装饰器,这里写装饰器的装饰规则
    print('enter deco_1')
    def wrapper(a,b):#若func是带参数的就再这里带上其参数
        print('enter deco_1_wrapper')
        func(a,b)
    return wrapper

def deco_2(func): #第二个装饰器
    print('enter deco_2')
    def wrapper(a,b):
        print('enter deco_2_wrapper')
        func(a,b)
    return wrapper

def main_1():#调用装饰器的写法,这里测试装饰器的调用顺序
    @deco_1
    @deco_2
    def func(a,b): #这里写需要被装饰的函数
        print('a+b = '+ str(a+b))

    #这时候如果直接运行会print:
    #    enter deco_2
    #    enter deco_1
    #注意顺序是先调用deco_2再调用deco_1


    #如果要调用带装饰器的func,直接用func(a,b)即可
    #
    func(3,8)
    #
    #即func(3,8) = deco_1(deco_2(func(3,8)))
    #这时候输出:
    #    enter deco_1_wrapper
    #    enter deco_2_wrapper
    #    a+b = 11
##############################################################

#--------------下面是带参数的装饰器写法-----------------------
def deco(judge):
    if judge:
        def deco_inner(func):
            def wrapper(a,b):
                print('我被装饰了')
                func(a,b)
                print('这个装饰函数结束了')
            return wrapper 
    else:
        def deco_inner(func):
            return func
    return deco_inner #这个return不加会报'NoneType' object is not callable
                      #带参数的装饰器要return两次
    
def main_2():#调用装饰器的写法
    @deco(True) #当judge为True时,进入上面的装饰器函数
    def func_1(a,b):
        print('a+b = '+ str(a+b))

    @deco(False) #当judge为True时,进入下面的装饰器函数
    def func_2(a,b):
        print('a+b = '+ str(a+b))
    
    print('***func1结果***:')
    func_1(1,2)
    print('***func2结果***:')
    func_2(2,4)
###############################################################

if __name__ == '__main__':
    print('-------------------main_1--------------------')
    main_1()
    print('-------------------main_1结束了--------------')
    print('-------------------main_2--------------------')
    main_2()
    print('-------------------main_2结束了--------------')

上面程序运行结果:

-------------------main_1--------------------
enter deco_2
enter deco_1
enter deco_1_wrapper
enter deco_2_wrapper
a+b = 11
-------------------main_1结束了--------------
-------------------main_2--------------------
***func1结果***:
我被装饰了
a+b = 3
这个装饰函数结束了
***func2结果***:
a+b = 6
-------------------main_2结束了--------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值