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
  • 相关阅读:
    javaWeb之eclipse创建Servlet模板快捷键设置
    DBUtils-对JDBC简单封装的开源工具类库
    JDBC连接池(三)DBCP连接池
    JDBC连接池-C3P0连接
    JavaWeb中jsp九大内置对象 和四大作用域
    JDBC连接池-自定义连接池
    JavaWeb中jdbcproperties配置文件
    python学习之字典(Dictionary)练习
    用$.getJSON() 和$.post()获取第三方数据做页面 ——惠品折页面(1)
    请求转发与请求重定向的区别
  • 原文地址:https://www.cnblogs.com/52-qq/p/7255540.html
Copyright © 2011-2022 走看看