深入浅出学习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 10 Python
python根据给定文件返回文件名和扩展名的方法
Mar 27 Python
python根据出生年份简单计算生肖的方法
Mar 27 Python
python的keyword模块用法实例分析
Jun 30 Python
Django查找网站项目根目录和对正则表达式的支持
Jul 15 Python
Python实现多线程抓取网页功能实例详解
Jun 08 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
Python 和 JS 有哪些相同之处
Nov 23 Python
docker django无法访问redis容器的解决方法
Aug 21 Python
python打包生成so文件的实现
Oct 30 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 Python
Python制作春联的示例代码
Jan 22 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 用数组降低程序的时间复杂度
2009/12/04 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
jquery中:input和input的区别分析
2011/07/13 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
当鼠标移动时出现特效的JQuery代码
2013/11/08 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
[08:40]Navi Vs Newbee
2018/06/07 DOTA
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
Python编写百度贴吧的简单爬虫
2015/04/02 Python
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
python入门前的第一课 python怎样入门
2018/03/06 Python
python实现字符串和字典的转换
2018/09/29 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
爱普生美国官网:Epson美国
2018/11/05 全球购物
劳动工资科岗位职责范本
2014/03/02 职场文书
个人租房协议书
2014/04/09 职场文书
欢度春节标语
2014/07/01 职场文书
教师自荐信范文
2015/03/06 职场文书
地道战观后感500字
2015/06/04 职场文书
总经理聘用协议书
2015/09/21 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
详解MySQL中的pid与socket
2021/06/15 MySQL