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

    # _*_ coding: utf-8 _*_

    # 1. 什么是装饰器?
    #
    # 装饰器本身可以是任意可调用的对象=>函数
    # 被装饰的对象也可以是任意可调用的对象=>函数
    #
    # 强调装饰器的原则:
    # 不修改被装饰对象的源代码
    # 不修改被装饰对象的调用方式
    #
    # 装饰器的目标:在遵循装饰器的原则的前提下,为被装饰对象添加上新功能
    #
    # 2. 为何要用装饰器?
    # 开放封闭原则:对修改封闭,对拓展开放
    #
    # 对修改封闭:
    # 不修改被装饰对象的源代码
    # 不修改被装饰对象的调用方式
    # 对拓展开放:
    # 遵循对修改封闭,可以添加新功能
    #
    # 装饰器就是要在不修改功能源代码以及调用方式的前提下为原功能添加额外新的功能
    #
    # 3. 怎么用装饰器

    import time
    # 调用python自带内置函数---》》全局作用域
    def original(): # 原函数
    print('Original function')
    time.sleep(1)

    def external(original_func):
    # original_func = original的内存地址
    def alter():
    start = time.time()
    original_func()
    # 局部作用域找值 alter()中没有
    # 去外层external---alter这一层中找到
    # 这时候original_func()等于original()
    stop = time.time()
    print('Run time is %s' %(stop - start))
    return alter
    # 返回alter的内存地址
    # 可以理解为把alter这个函数运行结果返回给了external的运行结果

    original = external(original)
    # 相当于alter(original的内存地址)
    # original_func = original的内存地址
    # original(原函数名) 相当于重新赋值了 代替旧函数
    original()
    # 此时调用过程
    # (重新赋值过的)original()-------》
    # external(original_func = (原函数内存地址)original)------》
    # 收到alter的返回值(alter整个函数体)-------》
    # 运行函数体----》original_func()=(原函数内存地址)original----》
    # 函数体运行完毕 此时(原函数original)功能没有改变 但从调用结果来看
    # 重新赋值过内存地址的original() 功能上发生改变但不影响(原函数original)
  • 相关阅读:
    批处理文件双击运行成功,程序调用却运行失败解决方案
    前端安全之加解密种类与HTTPS加密原理(二)
    node包管理nvm与pnpm(一)
    React状态管理—reduxAPI原理分析(三)
    动态规划原理与算法实践(二)
    双指针算法基本原理和实践(一)
    分治算法基本原理和实践(三)
    编程范式(一)
    Java基础
    前端模块化CommonJS、AMD、CMD、ES6模块(二)
  • 原文地址:https://www.cnblogs.com/OutOfControl/p/9714814.html
Copyright © 2011-2022 走看看