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)
  • 相关阅读:
    bootstrap_table自定义排序方法
    react 给组件设置默认的props值
    Echarts Binning on map 根据真实经纬度渲染数据
    Echarts 如何使用 bmap 的 API
    工作中遇到的前后台联调的一些规则
    redux 调试工具
    react 开发过程中的总结/归纳
    mac svn cornerstone 破解版资源以及使用方法(仅供学习,非商业使用)
    typescript 学习笔记
    iconfont 不居中的问题
  • 原文地址:https://www.cnblogs.com/OutOfControl/p/9714814.html
Copyright © 2011-2022 走看看