装饰器

  • 定义

    本质是函数,用来装饰其他函数,为其他函数添加附加功能。

    • 原则

      不能修改被装饰函数的源代码
      不能修改被装饰的函数的调用方式

    • 应用的知识

      高阶函数
      嵌套函数

    • 嵌套函数
    def a():print("aaaa")def b():         # 在函数a中 定义函数bprint("bbbb")
    # 函数b为嵌套函数
    
  • 装饰器

    • 基础装饰器
    # -*- encoding: utf-8 -*-
    # !@Author    : Merky
    import time
    def timer(func):      # func = test_1 test_1的内存地址赋值给了funcdef deco():start_time = time.time()func()stop_time = time.time()print("the func run time is %s" % (stop_time-start_time))return deco  # 返回deco的地址@timer # test_1 = timer(test_1)  =>  test_1 = deco   把 deco的物理地址赋值给了test_1
    def test_1():time.sleep(1)print("in the test1")
    test_1()
    
    • 带参数装饰器
    # -*- encoding: utf-8 -*-
    # !@Author    : Merky
    import time
    def timer(func):                # func = test_1 test_1的内存地址赋值给了funcdef deco(*args,**kwargs):start_time = time.time()func(*args,**kwargs)    # 此处调用func实际是调用了被装饰的函数stop_time = time.time()print("the func run time is %s" % (stop_time-start_time))return deco@timer           # test_1 = timer(test_1)  =>  test_1 = deco   把 deco的物理地址赋值给了test_1
    def test_1(name):time.sleep(1)print(name)def aa_1():time.sleep(0.5)print("in the aa_1")test_1("XIao")   # 传递参数问题
    aa_1()
    
    • 当被修饰函数有返回值时
    # -*- encoding: utf-8 -*-
    # !@Author    : Merky
    user, passw = "admin", "123456"def auth(func):           # func  = homedef wrapper(*args, **kwargs):username = input("username:").strip()password = input("password:").strip()if user == username and passw == password:print("\033[32;1mUser has passed authentication \033[0m")return func(*args, **kwargs)        # func执行的就是原来的被装饰的函数,其执行结果与原函数执行结果相同,故返回值在这里返回else:exit("\033[31;1mInvalid \033[0m")return wrapperdef index():print("welcome to index page!")@auth        # home  = wrapper
    def home():print("welcome to home page!")return "home has a return!"      # 此处的返回结果 为装饰器中 func()函数的执行结果@auth
    def bbs():print("welcome to bbs page!")index()
    print(home())
    bbs()
    

    实质上:
    装饰器就是在新定义的高阶嵌套函数中,将需要装饰的函数的物理地址作为一个函数参数传给装饰器,在新函数中新功能的恰当位置,调用这个参数,实际上是调用了原来被装饰的函数。从而在不修改原来函数的源代码和调用方式的基础上达到增添新功能的效果。

    基础装饰器例子中即把test_1地址赋值给 func,把deco地址赋值给test_1,
    调用func时,实现的被装饰原函数的调用,执行deco时,实现了把参数传入修饰器中的功能。

pytho基础(6)相关推荐

  1. pytho基础教程笔记(7-9)(类、递归、生成器)

    第七章 更加抽象 类和类型 类 概念: __metaclass__=type # 确保类是新版的 class Person:def setName(self, name):self.name = na ...

  2. Pytho基础 第三章

    Python基础 第三章 函数 3.1 概念整理 3.1.1 def语句和参数: 在调用print()或 len()等函数时,会传入一些值放于括号中间,在此称为参数.也可以自行定义接收参数的函数. d ...

  3. pytho基础之文件处理

    阅读目录 一 文件操作 二 打开文件的模式 三 操作文件的方法 四 文件内光标移动 五 文件的修改 一 文件操作 一 介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或 ...

  4. pytho基础——如何查看python版本及多个python版本

    前言 初学者来说,安装python过程是存在一定难度的. 在安装过程中,可能安装了多个python版本,可能安装了anaconda导致有自带的python,同时本身电脑也安装了官方下载的python也 ...

  5. Python学习-基础篇7 网络编程

    #pytho 基础之socket编程 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架 ...

  6. Python基础学习-Python中最常见括号()、[]、{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho

    Python基础学习-Python中最常见括号().[].{}的区别 2015-08-13 07:54 by xuxiaoxiaoxiaolu, 1138 阅读, 0 评论, 收藏, 编辑 Pytho ...

  7. pytho语法总结(1):基础知识,列表介绍,列表操作

    最近在离线电脑上处于不停的安软件失败,换版本再失败的过程,最终在自己的电脑上也费了很大劲终于安好了软件,因为新的软件中会设计到Python跟C++,所以花了2天时间重新看了一遍Python语法,这里在 ...

  8. python3基础教程廖雪峰云-学习廖雪峰Python3教程的pytho

    我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意 ...

  9. python数字信号处理应用中文pdf_人邮新书 Python数字信号处理应用 Python在DSP中应用教程 Python基础 Pytho...

    章声音和信号1 1.1周期信号1 1.2频谱分析3 1.3信号4 1.4波形的读写6 1.5频谱7 1.6波形对象7 1.7信号对象8 1.8练习10 第2章谐波11 2.1三角波11 2.2方波13 ...

最新文章

  1. 深度有趣 | 06 变分自编码器
  2. 大家都较熟悉之 Kubernetes API 分析
  3. 有关Linux下request.getRealPath(/)获取路径的问题
  4. Redis服务信息--Info指令
  5. JAVA环境配置 ECLIPSE配置(转)
  6. mysql索引下推原理_MySQL:好好的索引,为什么要下推?
  7. 如何判断微信定位服务器,如何快速找到自己的微信定位,完成实操作业?分享一下我的思路...
  8. hbase使用restful接口进行数据操作
  9. Linux 建立ftp站点
  10. ESP8285与ESP8266的差异
  11. ssq历史红蓝冷热号回归测试各个期与若干分析周期的中奖率(红号出现3个以上再输出)
  12. ArcCatalog导出数据库中shapefile
  13. 图表排版设计html,网页的排版(表格篇上)
  14. 获利能力分析实际数据收集流程
  15. 语言在工作中扮演的角色
  16. 怎样在PDF文件上添加印章
  17. java实现蒲福风级_蒲福风力级的意思_蒲福风力级是什么意思_蒲福风力级的近义词_反义词_读音-沪江在线词典...
  18. 2017车载后市场年终回顾:天下武功,唯快不破
  19. npx mrm lint-staged 报错
  20. Linux最全面试题100问答,纯纯爽文

热门文章

  1. 图扑 Web SCADA 零代码组态水泥生产工艺流程 HMI
  2. 如何查看服务器证书过期时间,如何看ssl证书过期
  3. 赠书:支付平台架构业务、规划、设计与实现
  4. 代码统计工具cloc使用
  5. Unity3D-VR《静夜诗》5-李白吟诗
  6. [py练习] 人口增长的问题
  7. 翻译文章“AST 模块:用 Python 修改 Python 代码”---!!注意ironpathyon未实现此功能...
  8. Microsoft MSN Messenger 7.0.0205 Beta Leaked
  9. tunel凋亡试剂盒说明书_QIA33 TUNEL显色法细胞凋亡检测试剂盒使用说明书_Merck
  10. iOS开发中SDK是什么?