资讯专栏INFORMATION COLUMN

Python装饰器:python真正入门的鉴定标准

ranwu / 1280人阅读

</>复制代码

  1. 上一篇文章:Python是动态语言:动态添加或删除属性、方法
    下一篇文章:私有化规则与属性Property

</>复制代码

  1. 装饰器功能:

  2. 引入日志

  3. 函数执行时间统计

  4. 执行函数前预备处理

  5. 执行函数后清理功能

  6. 权限校验

  7. 缓存

1、无参数函数的装饰器

实例:

</>复制代码

  1. from time import ctime,sleep
  2. def time_fun(func):
  3. #内部包裹函数
  4. def wrapped_fun():
  5. #ctime():打印当前时间
  6. print("%s 在 %s 时被调用"%(func.__name__,ctime()))
  7. #执行函数执行
  8. func()
  9. #把内部嵌套函数作为对象返回
  10. return wrapped_fun
  11. @time_fun
  12. def test():
  13. print("test 执行了")
  14. test()
  15. #休眠3秒
  16. sleep(3)
  17. test()

结果:

</>复制代码

  1. testWed Aug 15 22:19:51 2018 时被调用
  2. test 执行了
  3. testWed Aug 15 22:19:53 2018 时被调用
  4. test 执行了
2、有参数函数的装饰器

实例:

</>复制代码

  1. from time import ctime,sleep
  2. def time_fun(func):
  3. #内部包裹函数
  4. def wrapped_fun(a,b):
  5. #ctime():打印当前时间
  6. print("%s 在 %s 时被调用"%(func.__name__,ctime()))
  7. #执行函数执行
  8. func(a,b)
  9. #把内部嵌套函数作为对象返回
  10. return wrapped_fun
  11. @time_fun
  12. def test(a,b):
  13. print(a+b)
  14. test(1,2)
  15. #休眠3秒
  16. sleep(3)
  17. test(3,4)

结果:

</>复制代码

  1. testWed Aug 15 22:23:07 2018 时被调用
  2. 3
  3. testWed Aug 15 22:23:10 2018 时被调用
  4. 7
3、不定长函数的装饰器

实例:

</>复制代码

  1. from time import ctime,sleep
  2. def time_fun(func):
  3. #内部包裹函数
  4. def wrapped_fun(*args,**kwargs):
  5. #ctime():打印当前时间
  6. print("%s 在 %s 时被调用"%(func.__name__,ctime()))
  7. #执行函数执行
  8. func(*args,**kwargs)
  9. #把内部嵌套函数作为对象返回
  10. return wrapped_fun
  11. @time_fun
  12. def test(a,b,c):
  13. print(a+b+c)
  14. test(1,2,3)
  15. #休眠3秒
  16. sleep(3)
  17. test(3,4,5)

结果:

</>复制代码

  1. testWed Aug 15 22:26:36 2018 时被调用
  2. 6
  3. testWed Aug 15 22:26:39 2018 时被调用
  4. 12
4、带返回值函数的装饰器

实例:

</>复制代码

  1. from time import ctime,sleep
  2. def time_fun(func):
  3. #内部包裹函数
  4. def wrapped_fun(*args,**kwargs):
  5. #ctime():打印当前时间
  6. print("%s 在 %s 时被调用"%(func.__name__,ctime()))
  7. #执行函数执行
  8. return func(*args,**kwargs)
  9. #把内部嵌套函数作为对象返回
  10. return wrapped_fun
  11. @time_fun
  12. def test(a,b,c):
  13. print("test--",a+b+c)
  14. @time_fun
  15. def test2(a,b,c):
  16. return a+b+c
  17. test(1,2,3)
  18. print(test2(1,2,3))
  19. #休眠3秒
  20. sleep(3)
  21. test(1,2,3)
  22. print(test2(3,4,5))

结果:

</>复制代码

  1. testWed Aug 15 22:31:14 2018 时被调用
  2. test-- 6
  3. test2Wed Aug 15 22:31:14 2018 时被调用
  4. 6
  5. testWed Aug 15 22:31:17 2018 时被调用
  6. test-- 6
  7. test2Wed Aug 15 22:31:17 2018 时被调用
  8. 12
5、装饰器带有参数

实例:

</>复制代码

  1. from time import ctime,sleep
  2. def time_fun_pre(pre="hello"):
  3. def time_fun(func):
  4. # 内部包裹函数
  5. def wrapped_fun(*args, **kwargs):
  6. # ctime():打印当前时间
  7. print("%s 在 %s 时被调用,pre参数为:%s" % (func.__name__, ctime(),pre))
  8. # 执行函数执行
  9. return func(*args, **kwargs)
  10. # 把内部嵌套函数作为对象返回
  11. return wrapped_fun
  12. return time_fun
  13. @time_fun_pre("mark_test")
  14. def test(a,b,c):
  15. print("test--",a+b+c)
  16. @time_fun_pre("mark_test2")
  17. def test2(a,b,c):
  18. return a+b+c
  19. test(1,2,3)
  20. print(test2(1,2,3))
  21. #休眠3秒
  22. sleep(3)
  23. test(1,2,3)
  24. print(test2(3,4,5))

结果:

</>复制代码

  1. testWed Aug 15 22:43:27 2018 时被调用,pre参数为:mark_test
  2. test-- 6
  3. test2Wed Aug 15 22:43:27 2018 时被调用,pre参数为:mark_test2
  4. 6
  5. testWed Aug 15 22:43:30 2018 时被调用,pre参数为:mark_test
  6. test-- 6
  7. test2Wed Aug 15 22:43:30 2018 时被调用,pre参数为:mark_test2
  8. 12
6、类装饰器

</>复制代码

  1. python类装饰性必须要接受一个callable对象作为参数,然后返回一个callable对象,在python中,一般callable对象都是函数,

    只要对象重写了__call__()方法,那么这个对象就是callable对象。

实例:

</>复制代码

  1. class Test():
  2. def __init__(self,func):
  3. print("test初始化:",func.__name__)
  4. self.func=func
  5. def __call__(self, *args, **kwargs):
  6. print("我调用了")
  7. self.func
  8. @Test
  9. def test():
  10. print("--test--")
  11. test()

结果:

</>复制代码

  1. test初始化: test
  2. 我调用了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42245.html

相关文章

  • Python爬虫学习路线

    摘要:以下这些项目,你拿来学习学习练练手。当你每个步骤都能做到很优秀的时候,你应该考虑如何组合这四个步骤,使你的爬虫达到效率最高,也就是所谓的爬虫策略问题,爬虫策略学习不是一朝一夕的事情,建议多看看一些比较优秀的爬虫的设计方案,比如说。 (一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法...

    liaoyg8023 评论0 收藏0
  • Python函数装饰和闭包

    摘要:变量查找规则在中一个变量的查找顺序是局部环境,闭包,全局,内建闭包引用了自由变量的函数。闭包的作用闭包的最大特点是可以将父函数的变量与内部函数绑定,并返回绑定变量后的函数,此时即便生成闭包的环境父函数已经释放,闭包仍然存在。 导语:本文章记录了本人在学习Python基础之函数篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握装饰器的本质、功...

    caozhijian 评论0 收藏0
  • Python学习之路26-函数装饰和闭包

    摘要:初步认识装饰器函数装饰器用于在源代码中标记函数,以某种方式增强函数的行为。函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。只有涉及嵌套函数时才有闭包问题。如果想保留函数原本的属性,可以使用标准库中的装饰器。 《流畅的Python》笔记本篇将从最简单的装饰器开始,逐渐深入到闭包的概念,然后实现参数化装饰器,最后介绍标准库中常用的装饰器。 1. 初步认识装饰器 函数装饰...

    sunny5541 评论0 收藏0
  • Python

    摘要:最近看前端都展开了几场而我大知乎最热语言还没有相关。有关书籍的介绍,大部分截取自是官方介绍。但从开始,标准库为我们提供了模块,它提供了和两个类,实现了对和的进一步抽象,对编写线程池进程池提供了直接的支持。 《流畅的python》阅读笔记 《流畅的python》是一本适合python进阶的书, 里面介绍的基本都是高级的python用法. 对于初学python的人来说, 基础大概也就够用了...

    dailybird 评论0 收藏0
  • python装饰入门小结

    摘要:使用一年多了,一直知道有个装饰器,很好用,试图理解过,可能由于资料找的不好,自己的悟性太差,一直没有搞清楚,今天查了一些资料,算是理解了,现在简单记录下。 使用python一年多了,一直知道python有个装饰器,很好用,试图理解过,可能由于资料找的不好,自己的悟性太差,一直没有搞清楚,今天查了一些资料,算是理解了,现在简单记录下。python的装饰器本身的功能是在不改变已有函数本身的...

    SunZhaopeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<