一直想详细系统的总结一下decorator装饰器在python里面的作用。顾名思义,装饰器是用来装试的,好比一个房子,没有软装能不能住,能住,但膈不膈应,十分的膈应。所以没有装饰器,python依然可以玩的转,但是真正要掌握这门语言,装饰器还是要了解滴。

那么装饰器装饰的是什么,怎么装试,我们来看一段代码吧

def counttime(func):def countdown():start = time.time()func()end = time.time()print('waste{}'.format(start-end))return countdowndef method():print("hello world")if __name__ == "__main__"
temp = counttime(method)
temp()

这段代码可以计算method函数运行的时间,但是显得相当冗余,就像我们的毛坯房,能住,但是膈应。但是装试后,调用就变得简单了许多。装饰器的作用其实简化后就是表达式 temp = <functionname>(para)加上temp()的调用。除此之外,除了装试func函数表达式,我们也可以装试cls类。是不是很形象,为了给某个方法或类装饰一些额外的功能,我们使用到了装饰器。既然已经了解了装饰器的工作原理,继续深入的讲一下他的其它用法。

def counttime(func):def countdown():start = time.time()func()end = time.time()print('waste{}'.format(start-end))return countdown@counttime
def method():print("hello world")if __name__ == "__main__"
#temp = counttime(method)
#temp()method()

首先我们得讲一下python中默认的装饰器有哪些,比如staticmethod classmethod 和 property。 这三个装饰器都是给类用的。@property最为直接,直译过来就是性质,有些时候我们定义类的方法更像一个属性,我们加上@property后,调用方法就可以由<functionname>() -> <functionname>,是不是....很...嗯。优雅。classmethod和staticmethod两个装饰器装试后,该方法就不再属于某一特定的实例,而是用于单独使用。比如staticmethod装试后,该方法可以不用实例类,直接调用<classname>.<static/methodname>。而classmethod装试后(一般实现形式是<methodname>(cls, para1, para2)),该方法用于实例类时,改变一些该类的属性,比如person的性别和名字,角色的攻击防御等等。

class classdecorator:def __init__(self, num, name):self.num = numself.name = name@propertydef time_killer(self):return "this is timekiller"@staticmethoddef time_static():return "this is time_static"@classmethoddef addnum(cls, num, name):return cls(num, name)

另外还有个装饰器叫做functools。它的作用也很优雅。当我们在查看装试后的方法名称是,系统应为装试的原因,看不到它原本的样子,所以在我们阅读软件代码的时候可能带来一些问题。但是如果使用了wraps(functionname)装饰器,就像卸妆水和白酒,体会一下。

import functools
def advanceDecorator(func):@functools.wraps(func)def second(*args, **kwargs):print("this is in the second function")func(*args, **kwargs)print("end")return func(*args, **kwargs)return second

那么装饰器是否可以有多个呢,答案是可以的。房子除了硬装还有软装啊。我们可以用之前解释的公式套用,stack1(stack2(hello())),可以看得出来stack1嵌套的sec里面func其实代表的是stack2,而stack2嵌套的sec里面的func其实代表的是hello,所以装饰器放置的不同顺序也会改变执行的结果

def stack1(func):def sec():print("stack1")func()return secdef stack2(func):def sec():print("stack2")func()return sec@stack1
@stack2
def hello():print("hello world, and stack finished")

有些装饰器是带参数的,表现形式会有些许不同。可以看到俄罗斯套娃,一套一套。多了一套的目的其实也就是为了实现一个目的,把装饰器里面的参数带到下一层。另外如果greet方法里面有参数怎么办呢,在装试函数dotask里面可以用范式参数(*arg,**kwargs)来表示。

def repeatfunc(num_times):def repeat(func):def dotask( *args, **kwargs):for i in range(num_times):func()return dotaskreturn repeat@repeatfunc(num_times=4)
def greet():print("hello anna")print(greet.instance)

最后咱们看一个实际例子,用装饰器在python里面写一个singleton单例。其实单例在python里面用得还是蛮少的,因为大部分用global就可以很轻易的实现了。

def singleton(cls):global countprint("this is singleton function decorator")@functools.wraps(cls)def wrapper_singleton(*args, **kwargs):if not wrapper_singleton.instance:wrapper_singleton.instance = cls(*args, **kwargs)return wrapper_singleton.instancewrapper_singleton.instance = Nonecount+=1print("count is: ", count)return wrapper_singleton@singleton
class theOne:pass

从懵懂到精通装饰器在python里的作用相关推荐

  1. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

  2. python 装饰器 参数-python装饰器的详细解析

    什么是装饰器? python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能. 这个函数的特殊之处在于 ...

  3. python装饰器实例-Python装饰器实用例子

    Python里我们经常能见到@开头的句法,也就是人们常说的装饰器(decorator).装饰器是Python非常重要的一部分,能够产出更易于维护的代码.这篇文章会给大家带来装饰器的介绍以及几个实用的例 ...

  4. python装饰器原理-python装饰器的原理和使用

    一.最简单的装饰器 装饰器是python中很基础也很实用的一个特性.通过装饰器我们可以很方便地为一些函数添加相同的功能.我们以测量函数运行时间为例来讲一讲python装饰器的运行原理. 1.使用装饰器 ...

  5. python装饰器原理-Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  6. python装饰器原理-Python装饰器原理

    装饰器(Decorator)是面向对象设计模式的一种,这种模式的核心思想是在不改变原来核心业务逻辑代码的情况下,对函数或类对象进行额外的修饰.python中的装饰器由python解释器直接支持,其定义 ...

  7. python装饰器实例-Python装饰器简单用法实例小结

    本文总结分析了Python装饰器简单用法.分享给大家供大家参考,具体如下: 装饰器在python中扮演着很重要的作用,例如插入日志等,装饰器可以为添加额外的功能同时又不影响业务函数的功能. 比如,运行 ...

  8. python装饰器类-Python类装饰器

    上次介绍了Python的函数装饰器,这次我们来讲一讲Python的类装饰器. Python的类装饰器基本语法如下: defdecorator(cls):print "6666666" ...

  9. python装饰器-理解Python装饰器(Decorator)

    理解Python装饰器(Decorator) Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程. 想要理解Python中的装饰器,不得不先理解闭包(clo ...

最新文章

  1. jQuery 在Table中选择input之类的东西注意事项
  2. java中的乐活锁_(转)[乐活]别抱怨了,Shit happens!
  3. 最完美的Linux桌面软件
  4. python解决问题asp_用python实现面向对像的ASP程序实例
  5. python学习实例(3)
  6. oracle导出表中某天数据命令,Oracle数据库使用命令行导入导出数据表及数据内容(本地、远程)...
  7. axure 内部框架内容下滑_Axure教程:转盘抽奖交互原型
  8. [学习笔记]0/1分数规划
  9. Java设计模式学习总结(12)——结构型模式之外观模式
  10. webbrowser控件 加载为空白_OpenLayers教程五:地图控件之坐标拾取控件和鹰眼控件...
  11. Render Monkey中可渲染纹理的Clear Color
  12. ThinkPHP学生社团管理系统
  13. nvidia卸载程序失败_Adobe软件卸载与常见问题解决方案
  14. Android中setPositiveButton和setNegativeButton
  15. 2020智能营销领域最具商业合作价值企业盘点
  16. other 猿 多年收藏
  17. 传奇单机架设教程及游戏GM设置方法
  18. java删除奇数文件_java,奇数性的问题
  19. 用户sa登陆失败时,应该如何解决
  20. 工业互联网边缘计算技术发展与行业需求分析

热门文章

  1. 技术前沿与经典文章26:量子化与连续性之辩
  2. EMU,ARC 、NeoGeo CD 、GB/GBC 、MD 、SFC 、GG/SMS 、GBA 、PS 、PCE 模拟器移植方案
  3. matlab 有源电力滤波器,基于MATLAB的有源电力滤波器研究
  4. 论文投稿指南——中文核心期刊推荐(数学)
  5. 如何修改个人简历?一些过来人的经验
  6. 操作系统 --进程的异步性
  7. 安装 Logstash 并配置 ik 分词器
  8. midas显示代理服务器错误,[转载]在使用桥博、midas的时候经常会遇到的问题
  9. 用友U8案例教程采购报表
  10. Linux下对TF卡进行分区