浅析Python装饰器以及装饰器模式


Posted in Python onMay 28, 2018

漫谈

如果作为一个Python入门,不了解Python装饰器也没什么,但是如果作为一个中级Python开发人员,如果再不对python装饰器熟稔于心的话,那么可能并没有量变积累到质变。

我以前也看过很多讲python 装饰器的文章,但是都是看了就忘。一方面是没有做太多的练习,二是对它的领会不是很深。

希望引以为戒!!!

郑传

装饰模式

如果你了解Java,你肯定听过 装饰器模式。在面向对象中,装饰模式指:动态地给一个对象添加一些额外的职责。就增加一些功能来说,装饰模式比生成子类更为灵活。

在设计模式学习----装饰器模式,我摘取了下面一段使用装饰器模式的代码

public class DecoratorPattern { 
 
  /** 
   * @param args the command line arguments 
*/ 
  public static void main(String[] args) { 
    // TODO code application logic here 
    Basket basket = new Original(); 
    //一个装饰的过程 
    Basket myBasket =new AppleDecorator(new BananaDecorator(new OrangeDecorator(basket)));  
    myBasket.show(); 
  } 
}

等会注意下 Basket myBasket =new AppleDecorator(new BananaDecorator(new OrangeDecorator(basket))) 这段的写法

在Python官方文档PythonDecorators 是这么介绍装饰器的

What is a Decorator
A decorator is the name used for a software design pattern. Decorators dynamically alter the functionality of a function, method, or class without having to directly use subclasses or change the source code of the function being decorated.

翻一下: 就是装饰器是一种软件设计模式,被用来动态修改函数、方法,或者类功能却不是通过子类,或者修改原代码实现。

跟之前是一个意思!!!

Python Decorator
而Python的装饰器与之不同,官方这么说:

The "decorators" we talk about with concern to Python are not exactly the same thing as the DecoratorPattern described above. A Python decorator is a specific change to the Python syntax that allows us to more conveniently alter functions and methods (and possibly classes in a future version). This supports more readable applications of the DecoratorPattern but also other uses as well.
Support for the decorator syntax was proposed for Python in PEP 318, and will be implemented in Python 2.4.

翻译下:Python的 decorators 与 DecoratorPattern并不完全相同。 Python的decorator是一种特殊:在语法上实现允许我们更灵活地更改方法,或者函数。

例子:

@classmethod
def foo (arg1, arg2):
  ....

记住这个特殊的语法,后面我们会展示这个强大的语法糖

Python 相关文章推荐
python实现apahce网站日志分析示例
Apr 02 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 Python
Python构建XML树结构的方法示例
Jun 30 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
pandas把所有大于0的数设置为1的方法
Jan 26 Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 Python
python 导入数据及作图的实现
Dec 03 Python
使用Pandas的Series方法绘制图像教程
Dec 04 Python
基于Python+QT的gui程序开发实现
Jul 03 Python
python查询MySQL将数据写入Excel
Oct 29 Python
Python的这些库,你知道多少?
Jun 09 Python
Python装饰器知识点补充
May 28 #Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 #Python
django manage.py扩展自定义命令方法
May 27 #Python
python实现windows下文件备份脚本
May 27 #Python
django 解决manage.py migrate无效的问题
May 27 #Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 #Python
解决Django migrate No changes detected 不能创建表的问题
May 27 #Python
You might like
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
jQuery知识点整理
2015/01/30 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
详解JS异步加载的三种方式
2017/03/07 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
Python字节单位转换实例
2019/12/05 Python
python Tornado框架的使用示例
2020/10/19 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
护理专业的自荐信
2013/10/22 职场文书
会计电算化学生个人的自我评价
2014/02/08 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
西安兵马俑导游词
2015/02/02 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js
Win11 BitLocker 驱动器加密
2022/04/19 数码科技