• 装饰器浅谈


    1,单层装饰器

    def timer(func):
        def init(*args,**kwargs):
            func()
        return init
    
    @timer #func = timer(func) def func(
    *args,**kwargs): print('is here') func()

    2,多层装饰器

    def before(func):
        def init2(*args,**kwargs):
            print(111)
            func()
            print(5555)
        return init2
    
    def after(func):
        def init1(*args,**kwargs):
            print(2222)
            func()
            print(4444)
        return init1
    
    @before
    @after           #多层装饰器由外层装饰器包含内部装饰器    mid=before(after(mid))
    def mid(*args,**kwargs):
        print(333)
    
    mid()

    ===>
    111
    222
    333
    444
    555

    #打印结果的顺序和调用顺序刚好相反。
    函数的调用顺序
    1,
    after(mid) 先执行最里面的after return init1函数
    2,before(init1) 再次执行before函数 return init2
    3, 执行func() 因为函数func已经等于init2 ,所以打印111
    4,执行before里面的func() 因为前面before(init1)已经把func变成init1,所以变相的执行init1()
    5,执行init1() 打印2222
    6,执行after里面的func() 因为开始after(mid) 把mid函数穿进去了,所以执行mid()
    7,mid() 打印333
    8,执行完mid() 继续执行print(444)
    9,在打印444和5555

     3,带参数的装饰器:根据传的参数,后面进行其他逻辑操作

     3 F=False#为False时就把装饰器给去掉了
     4 def outer(flag):
     5     def wrapper(func):
     6         def inner(*args,**kwargs):
     7             if flag:
     8                 print('before')
     9                 ret=func(*args,**kwargs)
    10                 print('after')
    11             else:
    12                 ret = func(*args, **kwargs)
    13             return ret
    14         return inner
    15     return wrapper
    16 
    17 @outer(F)#@wrapper
    18 def hahaha():
    19     print('hahaha')
    20 
    21 @outer(F)
    22 def shuangwaiwai():
    23     print('shuangwaiwai')
    24 
    25 hahaha()
    26 shuangwaiwai()
  • 相关阅读:
    Alpha发布——美工+文案展示博客
    021_func
    020_with
    018_IO
    017_set
    016_dict
    015_string
    012_list
    010_ternaryOperation
    008_standard_lib_os
  • 原文地址:https://www.cnblogs.com/52forjie/p/9831662.html
Copyright © 2020-2023  润新知