装饰器

  1. """
    1、什么是装饰器
    器指的是工具/功能
    装饰指的是为被装饰对象添加额外的功能
  2.  
  3. 大白话:定义装饰器就是定义了一个函数,该函数就是用来为其他函数添加额外的功能的
  4.  
  5. 2、为何要用装饰器
    程序的开发需要遵循一个原则:开放封闭原则
    开放:指的是对拓展功能开放
    封闭:指的是对修改源代码封闭
  6.  
  7. 装饰器就是在不修改被装饰对象源代码以及调用方式的前提为被装饰对象添加上新功能
  8.  
  9. 3、如何用装饰器
  10.  
  11. """
    # 1、装饰器初探
    '''
    import time
  12.  
  13. def index(x, y):
    time.sleep(3)
    print('index===>', x, y)
  14.  
  15. # index(1,2)
  16.  
  17. def home(name):
    time.sleep(2)
    print('home====>', name)
  18.  
  19. # home("egon")
  20.  
  21. def outter():
    x = index
  22.  
  23. def wrapper(a, b):
    start_time = time.time()
    x(a, b)
    stop_time = time.time()
    print("run time is :%s" % (stop_time - start_time))
  24.  
  25. return wrapper # 千万不要加括号
  26.  
  27. index = outter() # f=wrapper
  28.  
  29. index(1, 2) # wrapper()
    '''
  30.  
  31. # 2、装饰器改进1
    """
    import time
  32.  
  33. def index(x, y):
    time.sleep(3)
    print('index===>', x, y)
  34.  
  35. def home(name):
    time.sleep(2)
    print('home====>', name)
  36.  
  37. def outter(x):
    # x = home
    def wrapper(*args,**kargs):
    start_time = time.time()
    x(*args,**kargs) # x("egon")
    stop_time = time.time()
    print("run time is :%s" % (stop_time - start_time))
    return wrapper # 千万不要加括号
  38.  
  39. index = outter(index) # index=wrapper
    home = outter(home) # home=wrapper
  40.  
  41. index(1, 2) # wrapper(1,2)
    home("egon") # wrapper("egon")
    """
  42.  
  43. # 3、装饰器改进2
    """
    import time
  44.  
  45. def index(x, y):
    time.sleep(3)
    print('index===>', x, y)
    return 456
  46.  
  47. def home(name):
    time.sleep(2)
    print('home====>', name)
    return 123
  48.  
  49. def outter(x):
    # x = home
    def wrapper(*args, **kargs):
    start_time = time.time()
    res = x(*args, **kargs) # x("egon")
    stop_time = time.time()
    print("run time is :%s" % (stop_time - start_time))
    return res
    return wrapper # 千万不要加括号
  50.  
  51. index = outter(index) # index=wrapper
    home = outter(home) # home=wrapper
  52.  
  53. res1 = index(1, 2) # wrapper(1,2)
    res2 = home("egon") # wrapper("egon")
    print("====>",res1)
    print("====>",res2)
  54.  
  55. """
  56.  
  57. 装饰器语法糖
  1. # 4、语法糖
    """
    import time
  2.  
  3. def outter(x):
    # x = home
    def wrapper(*args, **kargs):
    start_time = time.time()
    res = x(*args, **kargs) # x("egon")
    stop_time = time.time()
    print("run time is :%s" % (stop_time - start_time))
    return res
  4.  
  5. return wrapper # 千万不要加括号
  6.  
  7. @outter # index = outter(index) # index=wrapper
    def index(x, y):
    time.sleep(3)
    print('index===>', x, y)
    return 456
  8.  
  9. @outter # home = outter(home) # home=wrapper
    def home(name):
    time.sleep(2)
    print('home====>', name)
    return 123
  10.  
  11. res1 = index(1, 2) # wrapper(1,2)
    res2 = home("egon") # wrapper("egon")
    print("====>", res1)
    print("====>", res2)
    """
    import time
  12.  
  13. # 5、装饰器的模板
    """
    def outter(func):
    def wrapper(*args, **kwargs):
    res = func(*args, **kwargs)
    return res
    return wrapper
  14.  
  15. def timmer(func):
    def wrapper(*args, **kwargs):
    start=time.time()
    res = func(*args, **kwargs)
    stop=time.time()
    print(stop -start)
    return res
    return wrapper
  16.  
  17. def auth(func):
    def wrapper(*args, **kwargs):
    name = input("请输入您的账号:").strip()
    pwd = input("请输入您的账号:").strip()
    if name == "egon" and pwd == "123":
    print('登录成功')
    res = func(*args, **kwargs)
    return res
    else:
    print("账号密码错误")
    return wrapper
  18.  
  19. @auth
    def index(x, y):
    time.sleep(1)
    print('index===>', x, y)
    return 456
  20.  
  21. @auth
    def home(name):
    time.sleep(0.5)
    print('home====>', name)
    return 123
  22.  
  23. index(1,2)
    home("egon")
    """
  24.  
  25. # 最完整的模板
    from functools import wraps
  26.  
  27. def wrapper(f):
    @wraps(f)
    def inner(*args, **kwargs):
    res = f(*args, **kwargs)
    return res
  28.  
  29. return inner
  30.  
  31. 闭包函数查看文档
  1. # 6、wraps
    '''
    from functools import wraps
  2.  
  3. def timmer(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
    start=time.time()
    res = func(*args, **kwargs)
    stop=time.time()
    print(stop -start)
    return res
    # wrapper.__name__ = func.__name__
    # wrapper.__doc__ = func.__doc__
    return wrapper
  4.  
  5. @timmer # index=timmer(index) # index=wrapper
    def index(x, y):
    """
    这是index函数的文档注释
    """
    time.sleep(1)
    print('index===>', x, y)
    return 456
  6.  
  7. # index(1,2)
    # print(index.__name__)
    help(index)
    '''
  1.  

day14总结的更多相关文章

  1. python_way day14 CSS

    python_way day14 CSS 层叠样式表 一.CSS作用域: 二.css标签选择器 三.css样式 一.css作用域: 基本用法:style="样式" <body ...

  2. Spark Streaming揭秘 Day14 State状态管理

    Spark Streaming揭秘 Day14 State状态管理 今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作.State是SparkStreaming ...

  3. Python之路,Day14 - It's time for Django

    Python之路,Day14 - It's time for Django   本节内容 Django流程介绍 Django url Django view Django models Django ...

  4. 【JAVA零基础入门系列】Day14 Java对象的克隆

    今天要介绍一个概念,对象的克隆.本篇有一定难度,请先做好心理准备.看不懂的话可以多看两遍,还是不懂的话,可以在下方留言,我会看情况进行修改和补充. 克隆,自然就是将对象重新复制一份,那为什么要用克隆呢 ...

  5. 11.1 正睿停课训练 Day14

    目录 2018.11.1 正睿停课训练 Day14 A 字符串 B 取数游戏(贪心) C 魔方(模拟) 考试代码 B C 2018.11.1 正睿停课训练 Day14 时间:3.5h 期望得分:100 ...

  6. python学习 day14 (3月19日)----

    04 json # 1. 用于多种语言 交互 编程语言通用数据 # 内置的 不需要安装直接导入使用 import json # 导入 # # dumps loads dump load # dic = ...

  7. day13,day14

    day13 迭代器 什么是迭代器? 迭代:是一个重复的过程,每一次重复,都是基于上一次的结果而进行的 器:迭代取值的工具 为何要用迭代器? 迭代器提供了一种通用的不依赖于索引的迭代取值方式 如何用迭代 ...

  8. day14(xml 编写及解析)

    编写 xml的组成: 1.文档的声明 <?xml version='1.0' encoding='UTF-8' standalone='yes'> xml 表示标签的名字 encoding ...

  9. python开发学习-day14(jquery、ajax等)

    s12-20160421-day14 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  10. day14(编码实战-用户登录注册)

    day14 案例:用户注册登录 要求:3层框架,使用验证码   功能分析 注册 登录   1.1 JSP页面 regist.jsp 注册表单:用户输入注册信息: 回显错误信息:当注册失败时,显示错误信 ...

随机推荐

  1. react后台管理系统路由方案及react-router原理解析

        最近做了一个后台管理系统主体框架是基于React进行开发的,因此系统的路由管理,选用了react-router(4.3.1)插件进行路由页面的管理配置. 实现原理剖析 1.hash的方式   ...

  2. PMBOK 基础知识(1)

    启动.结束过程 项目管理计划 第一章  引论 第2章项目运行环境 第3章 项目经理的角色 第4章 项目整合管理 第5章 项目范围管理 第6章 项目进度管理 第7章 项目成本管理 第8章 项目质量管理  ...

  3. Flask 的模板渲染

    Flask 的模板渲染 渲染模板语言和django很像,都是用{{}},{%%} 注意点: 1 flask给模板传值,render_template("index.htm",use ...

  4. kernel list 实践

    list.h /******* 链表实现,来自内核 **************************************************/ /** * container_of - c ...

  5. ubuntu qwt6.1.0安装

    1.ubuntu-12.04 qt-5.1.1 2.sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev 3.qmake 4.make 5.sud ...

  6. 2019-02-02 Python学习之多线程

    1.主线程和次线程 若主线程结束则次线程也会结束 如何避免主线程先结束: 结尾处加上 while True: pass e.g. import win32api #引用系统函数 import _thr ...

  7. 在android项目中使用FontAwesome字体

    在android项目中使用FontAweSome图标集,可以方便的适配各种屏幕分辨率,不必在各种不同分辨率文件夹中新建资源文件.使用字体是一种很巧妙的方法,把图像以字体的方式呈现,这样以前设置为and ...

  8. ES6 基本语法:

    ES6.基本语法* ES6可以使用=>作为函数表达形式,简单的风格: 参数 + => +函数体;* 在JS中是以var定义一个变量 ,在ES6中是以let定义变量; let 和 var 区 ...

  9. C/C++语言的学习方向

    这个世界上有太多的坑,如果我们不具备查阅资料的能力和对现实世界的思考能力,入坑是大概率的事情. C/C++语言能做什么?C/C++程序员在做什么?企业需要什么样的C/C++程序员?对初学者来说,要搞清 ...

  10. android 中IntentService的使用场景

    IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行 ...