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)
  • 相关阅读:
    Agile PLM opmn can not started
    参数化模块设计技术
    Enable the Load to CAD Action menu
    Agile Product Collaboration
    Configuration Handling SolidWorks
    SolidWorks 动画模拟仿真
    Agile PLM PC 模块实施方法论
    单因素方差分析的SAS实现
    非参中多样本的趋势秩检验的计算机实现
    游戏数据分析中“次日留存率”与“游戏生命周期第N天上线率”的SAS实现
  • 原文地址:https://www.cnblogs.com/OutOfControl/p/9714814.html
Copyright © 2011-2022 走看看