zoukankan      html  css  js  c++  java
  • Python函数式编程之装饰器

    原则:对修改是封闭的,对扩展是开放的,
    方法:一般不修改函数或者类,而是扩展函数或者类

    一:装饰器
    允许我们将一个提供核心功能的对象和其他可以改变这个功能的对象’包裹‘在一起,
    使用装饰对象的任何对象与装饰前后该对象的交互遵循完全相同的方式

    二:装饰器的用途
    (1)增强一个组件向另一个组件发送数据时的响应能力
    (2)支持多种可选行为
    (3)对一个单元做代码上的修改(即代码的复用)
      1 import time
      2 
      3 # ----------------------------------------------------------------#
      4 # 装饰器一
      5 # ----------------------------------------------------------------#
      6 
      7 
      8 def f1():
      9     print("Local time is ")
     10     # print(time.time())
     11 
     12 
     13 def f2():
     14     print("Local time is ")
     15     # print(time.time())
     16 
     17 
     18 f1()
     19 f2()
     20 
     21 # 给每一个函数添加一个打印当前时间,做下面的修改,没有违反修改是封闭的原则
     22 
     23 
     24 def print_current_time(func):
     25     print(time.time())
     26     func()
     27 
     28 
     29 print_current_time(f1)
     30 print_current_time(f2)
     31 
     32 # 抛出问题 打印时间是函数本身的,并不是强加函数
     33 
     34 # ----------------------------------------------------------------#
     35 # 装饰器二
     36 # ----------------------------------------------------------------#
     37 
     38 
     39 def decorator(func):
     40     def wrapper():  # 被封装的意思
     41         print(time.time())
     42         func()
     43     return wrapper
     44 
     45 
     46 def f1():
     47     print("This is a function:")
     48 
     49 
     50 f = decorator(f1)   # 将函数f1装饰
     51 f()     # 执行装饰后的结果
     52 
     53 
     54 # ----------------------------------------------------------------#
     55 # 装饰器三
     56 # ----------------------------------------------------------------#
     57 
     58 
     59 def decorator(func):
     60     def wrapper():  # 被封装的意思
     61         print(time.time())
     62         func()
     63     return wrapper
     64 
     65 
     66 @decorator
     67 def f1():
     68     print("This is a function:")
     69 
     70 
     71 f1()    # 不改变函数的调用
     72 
     73 
     74 # ----------------------------------------------------------------#
     75 # 装饰器四
     76 # ----------------------------------------------------------------#
     77 
     78 def hello(fn):  # fn为回调函数
     79     def wrapper():
     80         print('hello, %s' % fn.__name__)
     81         fn()
     82         print('goodbye, %s' % fn.__name__)
     83     return wrapper
     84 
     85 
     86 @hello
     87 def foo():
     88     print("I am a foo")
     89 
     90 
     91 foo()
     92 
     93 
     94 # ----------------------------------------------------------------#
     95 # 装饰器五之装饰器终极形态
     96 # ----------------------------------------------------------------#
     97 
     98 
     99 def decorator(func):
    100     def wrapper(*func_name, **kw):  # 被封装的意思
    101         print(time.time())
    102         func(*func_name, **kw)  # 处理抽象函数
    103     return wrapper
    104 
    105 
    106 @decorator
    107 def f_1(func_name):
    108     print("This is a function:" + func_name)
    109 
    110 
    111 @decorator
    112 def f_2(func_name1, func_name2):    # 多参数函数
    113     print("This is a function:" + func_name1 + func_name2)
    114 
    115 
    116 @decorator
    117 def f_3(func_name1, func_name2, **kw):
    118     print("This is a function:" + func_name1 + func_name2)
    119     print(kw)
    120 
    121 
    122 def f_4(func_name1, func_name2, **kw):
    123     print("This is a function:" + func_name1 + func_name2)
    124     print(kw)
    125 
    126 
    127 f_1('qqq')    # 不改变函数的调用
    128 f_2('aa', 'dd')
    129 f_4('aa', 'dd', a=1, b=2, c=3)
    130 f_3('aa', 'dd', a=1, b=2, c=3)

    一步一步理解装饰器,装饰器特别好用!

     
  • 相关阅读:
    USACO提交方法
    洛谷 P1967 【货车运输】
    一本通 P1386 【打击犯罪】
    洛谷 P5767 【最优乘车】
    洛谷 P5658 【括号树】
    洛谷 P5657 【格雷码】
    洛谷 P2272 【最大半连通子图】
    二分图匈牙利算法
    最小生成树Kruskal算法
    觉得写出了抽象类和接口,以及概括了设计模式的宗旨
  • 原文地址:https://www.cnblogs.com/faithyiyo/p/9768383.html
Copyright © 2011-2022 走看看