python装饰器的深入浅出


本文摘自php中文网,作者黄舟,侵删。

这篇文章主要和大家一起深入浅出的学习python装饰器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

先看下代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# 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()()) # 调用无参数的嵌套函数...

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

# 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中add函数怎么用

Python发展至今有哪些版本,各版本有什么区别?

Python单链表中如何查找和删除节点?

Python模块之time模块介绍

%s在Python中是什么意思

Python读写文件的代码示例

Python3.6.4如何安装到树莓派3代

Python中where()函数的用法详解

Python数据类型的区别

更多相关阅读请进入《Python》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...