深入浅出学习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常见文件操作的函数示例代码
Nov 15 Python
Python 变量类型及命名规则介绍
Jun 08 Python
下载安装setuptool和pip linux安装pip    
Jan 24 Python
Python 的内置字符串方法小结
Mar 15 Python
python实现简单购物商城
May 21 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
详解Django定时任务模块设计与实践
Jul 24 Python
python 扩展print打印文件路径和当前时间信息的实例代码
Oct 11 Python
python tkinter实现连连看游戏
Nov 16 Python
python Pexpect模块的使用
Dec 25 Python
python数据抓取3种方法总结
Feb 07 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 array_intersect()函数使用代码
2009/01/14 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
微信支付开发交易通知实例
2016/07/12 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
vue将data恢复到初始状态 && 重新渲染组件实例
2020/09/04 Javascript
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
python实现多线程网页下载器
2018/04/15 Python
python中cPickle类使用方法详解
2018/08/27 Python
Python操作json的方法实例分析
2018/12/06 Python
24式加速你的Python(小结)
2019/06/13 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
python实现人机五子棋
2020/03/25 Python
毕业证丢失证明
2014/01/15 职场文书
服务员岗位责任制
2014/02/11 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
医德医风个人总结
2015/02/28 职场文书
大学生入党自传2015
2015/06/26 职场文书
create-react-app开发常用配置教程
2022/06/25 Javascript