• 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)

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

     
  • 相关阅读:
    04: Dom
    03: JavaScript基础
    02: css常用属性
    01: html常用标签
    03: Memcached
    01: Redis缓存系统
    01: RabbitMQ
    04: 事件驱动、五种I/O操作、I/O多路复用select和epoll
    03: 进程、线程、协程
    [Android] 任意时刻从子线程切换到主线程的实现
  • 原文地址:https://www.cnblogs.com/faithyiyo/p/9768383.html
Copyright © 2020-2023  润新知