Python装饰器模式定义与用法分析


Posted in Python onAugust 06, 2018

本文实例讲述了Python装饰器模式定义与用法。分享给大家供大家参考,具体如下:

装饰器模式定义:动态地给一个对象添加一些额外的职责。

在Python中Decorator mode可以按照像其它编程语言如C++, Java等的样子来实现,但是Python在应用装饰概念方面的能力上远不止于此,Python提供了一个语法和一个编程特性来加强这方面的功能。

首先需要了解一下Python中闭包的概念:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

Python装饰器模式定义与用法分析

def makeblod(fn):
  def wrapped():
    return '<b>'+fn()+'</b>'
  return wrapped
def makeitalic(fn):
  def wrapped():
    return '<i>'+fn()+'</i>'
  return wrapped
@makeblod
@makeitalic
def hello():
  return 'hello world'
print hello()

运行结果:

<b><i>hello world</i></b>

Python装饰器模式定义与用法分析

def deco(arg):
  def _deco(func):
    def __deco():
      print "before %s called [%s]." % (func.__name__, arg)
      func()
      print "after %s called [%s]." % (func.__name__, arg)
    return __deco
  return _deco
@deco("mymodule")
def myfunc():
  print "myfunc() called."
myfunc()

运行结果:

before myfunc called [mymodule].
myfunc() called.
after myfunc called [mymodule].

关于闭包学习可参考:https://3water.com/article/54498.htm

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python抓取Discuz!用户名脚本代码
Dec 30 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
Nov 29 Python
python自动重试第三方包retrying模块的方法
Apr 24 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
python函数定义和调用过程详解
Feb 09 Python
Python实现动态循环输出文字功能
May 07 Python
基于python生成英文版词云图代码实例
May 16 Python
keras slice layer 层实现方式
Jun 11 Python
Python实现的建造者模式示例
Aug 06 #Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 #Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 #Python
Anaconda下配置python+opencv+contribx的实例讲解
Aug 06 #Python
Django添加sitemap的方法示例
Aug 06 #Python
python中scikit-learn机器代码实例
Aug 05 #Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 #Python
You might like
如何删除多级目录
2006/10/09 PHP
PHP中常用数组处理方法实例分析
2008/08/30 PHP
PHP集成FCK的函数代码
2008/09/27 PHP
ionCube 一款类似zend的PHP加密/解密工具
2010/07/25 PHP
探讨方法的重写(覆载)详解
2013/06/08 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
深入探寻seajs的模块化与加载方式
2015/04/14 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
使用python实现接口的方法
2017/07/07 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
一套带答案的C++笔试题
2014/01/10 面试题
建设工地安全标语
2014/06/07 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
pytorch中[..., 0]的用法说明
2021/05/20 Python