深入浅出学习python装饰器


Posted in Python onSeptember 29, 2017

之前就了解到了装饰器, 但是就会点皮毛, 而且对其调用方式感到迷茫,正好现在的项目我想优化,就想到了用装饰器, 因此深入研究了下装饰器.

先看下代码:

import time


# 将函数作为参数传入到此方法....
def timeif(func):
  def wrapper(arg):
    print("in wrapper() %s" % (arg))
    start = time.clock()
    func(arg)
    end = time.clock()
    print("used: %s %s" % (end-start, arg))
  return wrapper


@timeif
def foo(arg):
  print("in foo() %s" % (arg))


if __name__ == '__main__':
  foo(" Hello ") # 表示执行foo函数....

我的疑惑就是明明return 的是一个函数名,按道理来讲,返回的就是一个函数地址啊!我理解有问题?随后上网查资料,又是闭包....但是我个人对它不感冒,随后自己分析,总结出了一段程序,看完你就知道原因了.
程序:

# coding=utf-8
# 带参数的函数 返回一个函数地址就行....
def funX(x):
  def funY():
    return x
  return funY


# 不带参数的函数....
def funX1():
  print("调用函数funX1")

  def funY1():
    print("调用函数funY1")
  return funY1


if __name__ == '__main__':
  # print(funX(5)()) # 调用有参数的嵌套函数...
  
  print(funX1()()) # 调用无参数的嵌套函数...

这和我们的装饰器不像吗?这就是我们的装饰器!因此,我们可以按照上面的程序来理解,也就是说它是首先确定参数个数,随后分别传入的,下面,我们来改写代码:

# coding=utf-8
import time


# 将函数作为参数传入到此方法....
def timeif(func):
  def wrapper(arg):
    print("in wrapper() %s" % (arg))
    start = time.clock()
    func(arg)
    end = time.clock()
    print("used: %s %s" % (end-start, arg))
  return wrapper


# @timeif
def foo(arg):
  print("in foo() %s" % (arg))


if __name__ == '__main__':
  timeif(foo)(' Hello')

深入浅出学习python装饰器

深入浅出学习python装饰器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用bs4获取58同城城市分类的方法
Jul 08 Python
Python中字典的基础知识归纳小结
Aug 19 Python
学习python 之编写简单乘法运算题
Feb 27 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
Python正则表达式教程之二:捕获篇
Mar 02 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
Django  ORM 练习题及答案
Jul 19 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
什么是python的自省
Jun 21 Python
Python 远程开关机的方法
Nov 18 Python
pycharm Tab键设置成4个空格的操作
Feb 26 Python
Python连接phoenix的方法示例
Sep 29 #Python
Python矩阵常见运算操作实例总结
Sep 29 #Python
利用python求解物理学中的双弹簧质能系统详解
Sep 29 #Python
python中装饰器级连的使用方法示例
Sep 29 #Python
python中map()函数的使用方法示例
Sep 29 #Python
python中reduce()函数的使用方法示例
Sep 29 #Python
Django Admin 实现外键过滤的方法
Sep 29 #Python
You might like
php将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
精心挑选的15款优秀jQuery 本特效插件和教程
2012/08/06 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
基于树莓派的语音对话机器人
2019/06/17 Python
python retrying模块的使用方法详解
2019/09/25 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
python代码实现猜拳小游戏
2020/11/30 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
html5唤醒APP小记
2019/03/27 HTML / CSS
牵手50台湾:专为黄金岁月的单身人士而设的交友网站
2021/02/18 全球购物
人事助理自荐信
2014/02/02 职场文书
休学证明范本
2015/06/19 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
Python字符串的转义字符
2022/04/07 Python