zoukankan      html  css  js  c++  java
  • 装饰器

    装饰器的本质:一个闭包函数

    装饰器的功能:在不修改原函数及其调用方式的情况下对原函数的功能镜像扩展

    语法糖:

     1 import time
     2 def timer(func):
     3     def inner():
     4         start = time.time()
     5         func()
     6         print(time.time() - start)
     7     return inner
     8 @timer   #==> func1 = timer(func1)   ===>语法糖
     9 def func1():
    10     print('in func1')
    11 func1()
    12 
    13 装饰器——语法糖
    View Code

    开放封闭原则:对扩展开放,对修改封闭

    1.对扩展是开放的
    
        为什么要对扩展开放呢?
    
        我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
    
      2.对修改是封闭的
    
        为什么要对修改封闭呢?
    
        就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
    
    装饰器完美的遵循了这个开放封闭原则。
    
    装饰器的主要功能和固定格式:
    
    功能:在不改变函数的调用方式的基础上在函数前后添加某些功能

    固定格式:

    1 def timer(func):
    2     def inner(*args,**kwargs):
    3         '''执行函数之前要做的'''
    4         re = func(*args,**kwargs)
    5         '''执行函数之后要做的'''
    6         return re
    7     return inner
    固定万能格式

    带参数的装饰器:

     1 def outer(flag):
     2     def timer(func):
     3         def inner(*args,**kwargs):
     4             if flag:
     5                 print('''执行函数之前要做的''')
     6             re = func(*args,**kwargs)
     7             if flag:
     8                 print('''执行函数之后要做的''')
     9             return re
    10         return inner
    11     return timer
    12 @outer(False)
    13 def func():
    14     print(111)
    15 func()
    View Code

    多个装饰器修饰同一个函数:

     1 def wrapper1(func):
     2     def inner():
     3         print('wrapper1 ,before func')
     4         func()
     5         print('wrapper1 ,after func')
     6     return inner
     7 def wrapper2(func):
     8     def inner():
     9         print('wrapper2 ,before func')
    10         func()
    11         print('wrapper2 ,after func')
    12     return inner
    13 @wrapper2
    14 @wrapper1
    15 def f():
    16     print('in f')
    17 f()
    View Code
  • 相关阅读:
    1276
    1235
    1170
    Grids
    1137
    1127
    1076
    🍖Mysql三种模式的指定方式介绍
    🍖存储引擎介绍
    🍖MySQL库的详细操作
  • 原文地址:https://www.cnblogs.com/52-qq/p/7255540.html
Copyright © 2011-2022 走看看