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)
  • 相关阅读:
    菜单展开效果
    css3 实现运动动画 圆与椭圆
    css3 翻起页脚
    css3 实现loading效果
    css3
    jquery/原生js/css3 实现瀑布流以及下拉底部加载
    JSON
    js中变量声明提前
    Object.prototype.toString.call(obj)检测数据类型
    call,apply,bind与es6的数组扩展运算符...
  • 原文地址:https://www.cnblogs.com/OutOfControl/p/9714814.html
Copyright © 2011-2022 走看看