zoukankan      html  css  js  c++  java
  • 22_装饰器、带参数的装饰器、多个装饰器装饰一个函数

    一、装饰器的执行流程

     1 def wrapper(func):
     2     def inner(*args,**kwargs):
     3         ret = func(*args,**kwargs)
     4         return ret
     5     return inner
     6 
     7 @wrapper   #fun = wrapper(fun)
     8 def fun(s):
     9     print('666')
    10     return s
    11 
    12 fun('777')
    13 print(fun('777'))
    14 
    15 '''
    16 1.程序至上而下,遇到wrapper() 保存到内存中
    17 2.@wrapper   ==   fun = wrapper(fun)  
    18 3.执行wrapper(fun)   --> return inner
    19 4.return  inner  --->  fun = inner
    20 5.fun = inner
    21 6.把fun()放到内存中
    22 7.执行fun()  ->  inner()
    23 8.print('666')
    24 9.renturn ret --> return s
    25 '''
    装饰器执行流程

    二、开放封闭原则

    关于开放封闭原则,其核心的思想是:
    软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
    因此,开放封闭原则主要体现在两个方面:
    对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
    对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
    装饰器完美吻合这一原则,在不改变被修饰函数以及业务逻辑前提下,额外的添加功能。

    三、带参数的装饰器

     1 import time
     2 
     3 flag = False
     4 def out(flag):
     5     flag = flag
     6     def wrapper(func):
     7         def inner(*args,**kwargs):
     8             if flag:
     9                 start_time = time.time()
    10                 time.sleep(1)
    11                 ret = func(*args,**kwargs)
    12                 end_time = time.time()
    13                 return end_time - start_time
    14             else:
    15                 func(*args,**kwargs)
    16         return inner
    17     return wrapper
    18 
    19 @out(True)  #out(True/False)   ->  返回的是wrapper ===>>>  @wrapper
    20 def func():
    21     print('666')
    22 
    23 func()

    四、多个装饰器装饰一个函数

     1 def wrapper1(func):
     2     def inner1(*args,**kwargs):
     3         print('wrapper1  before')
     4         func()
     5         print('wrapper1  after')
     6     return inner1
     7 
     8 def wrapper2(func):
     9     def inner2(*args,**kwargs):
    10         print('wrapper2  before')
    11         func()  #wrapper1 的 inner
    12         print('wrapper2  after')
    13     return inner2
    14 
    15 @wrapper2  # func() = wrapper2(func)  -> inner2
    16 @wrapper1 # func = wrapper1(func)  wrapper1的inner
    17 def func():
    18     print('6666')
    19 
    20 func()

    执行流程:

     1 '''
     2 1.执行wrapper1 -> func = wrapper1(func) -> func = inner1(func)
     3 2.执行wrapper2 -> func = wrapper2(func) -> func = inner2(inner1)
     4 
     5 3. -> fun()==>inner2   : print('wrapper2  before') 
     6 4. func()  wrapper2 中的func()实际上是wrapper1的inner     print('wrapper1  before')
     7 6. 执行wrapper1 中的 func()  --->   6666  
     8 7.执行完wrapper1中的func() 继续往下,执行print('wrapper1  after')
     9 7.执行完inner1  之后,返回,程序继续往下执行  print('wrapper2  after')
    10 '''
  • 相关阅读:
    经济危机下,自主创业已成为一种时代潮流?
    曾靖雯(帮别人名字作诗)
    四大内伤造就80后创业高失败率
    如何让创业的路不再崎岖
    叶莉(帮别人名字作诗)
    谁能够在萧条中生存?历史总是惊人相似的(转)
    哪种书最适合创业者阅读
    中西部崛起 关键是要激发普遍的创业热情
    每日英语:Dating in China Is a Largely Commercial Transaction
    每日英语:Poor Chinese Schools Tell Students: Bring Your Own Desks
  • 原文地址:https://www.cnblogs.com/weihengblog/p/8418160.html
Copyright © 2011-2022 走看看