python cookbook 学习系列(一) python中的装饰器
简介
原理
实现装饰器的最主要的原因是python中一切皆为对象,我们会把方法看做一个对象包装起来
实现
首相,我们先来看一个简单的例子,有一个add方法:
def add(x, y):
print('result is {}'.format(x + y))
现在有一个新的需求,我们想在这个方法执行完之后print一句话证明他执行成功了,同样我们又不想修改这个add方法,那我们可以新建一个方法:
def printres(func):
func()
print('Done')
printres(add)
那这样是ok的。但是这样的话,我们每次都要将一个函数作为参数传递给printres函数。而且这种方式已经破坏了原有的代码逻辑结构,之前执行业务逻辑时,执行运行add(),但是现在不得不改成printres(add)。那么有没有更好的方式的呢?当然有,答案就是装饰器。我就直接贴代码:
# coding=utf-8
"""
学习装饰器 2016-08-20 by oldman
"""
from functools import wraps """
先来看一个简单的装饰器
""" def decor1(func):
@wraps(func)
def wrapper(*args, **kwargs):
func(*args, **kwargs)
print('i am a decorate') return wrapper @decor1
def add(x, y):
print('result is {}'.format(x + y)) # if __name__ =="__main__":
# add(2,3) """
再来看一个带参数的装饰器
""" def decor2(parm):
"""
parm为装饰器用到的参数
""" def _decor2(func): # func为被装饰的函数
@wraps(func) # wraps 装饰器会把func的元数据带过来
def wrapper(*args, **kwargs):
if parm:
func(*args, **kwargs)
print('I am true')
else:
print('sorry, false') return wrapper return _decor2 @decor2(True) # 这里装饰器的参数为True
def add1(x, y):
print('result is {}'.format(x + y)) if __name__ == '__main__':
add1(2, 3)
注意到functools.wraps,wraps本身也是一个装饰器,它能把原函数的元信息拷贝到装饰器函数中,这使得装饰器函数也有和原函数一样的元信息了,如果不在装饰器里使用@wrap的话,被装饰的函数的元信息会丢失。
总结
这是一个很好的解决方案,不得不感叹python的灵活,人生苦短,我用python。
参考文章:http://www.zhihu.com/question/26930016
学习交流群 :226704167
python cookbook 学习系列(一) python中的装饰器的更多相关文章
- python开发学习-day04(迭代器、生成器、装饰器、二分查找、正则)
s12-20160123-day04 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- python框架之Django(8)-CBV中添加装饰器
现有如下检查登录装饰器: from functools import wraps def check_login(func): @wraps(func) def inner(request, *arg ...
- 《Python爬虫学习系列教程》学习笔记
http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己 ...
- [转]《Python爬虫学习系列教程》
<Python爬虫学习系列教程>学习笔记 http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多. ...
- Comprehensive learning path – Data Science in Python深入学习路径-使用python数据中学习
http://blog.csdn.net/pipisorry/article/details/44245575 关于怎么学习python,并将python用于数据科学.数据分析.机器学习中的一篇非常好 ...
- python cookbook学习1
python cookbook学习笔记 第一章 文本(1) 1.1每次处理一个字符(即每次处理一个字符的方式处理字符串) print list('theString') #方法一,转列表 结果:['t ...
- PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的按钮改变缺省文字的方法
在Qt Designer中可以预先定义标准按钮,相关支持的标准按钮请见<PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButton ...
- PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox增加自定义按钮的方法
在Qt Designer中可以预先定义标准按钮,相关支持的标准按钮请见<PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的StandardButton ...
- PyQt(Python+Qt)学习随笔:Designer中QDialogButtonBox确认clicked信号是哪个按钮发送的方法
一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...
随机推荐
- ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化
原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...
- C# ListView点击列头进行排序
/// <summary> /// This class is an implementation of the 'IComparer' interface. /// </summa ...
- asp.net获取数据库连接字符串
1.添加引用 using System.Configuration; 2.代码 string strConnectionString=ConfigurationManager.AppSettings[ ...
- JAVA 读写Excel
ExcelUtil.java package pers.kangxu.datautils.utils; import java.io.File; import java.io.FileInputStr ...
- 新手入门JUnit单元测试
首先将JUnit插件安装到Eclipse或myeclipse里面,编写完一个模块或者实体类的时候,直接右击,new一个JUnit项目,选择你想测试的实体类(模块),然后会自动生成一个类,这个类,我们将 ...
- html中role的作用
role 是增强语义性,当现有的HTML标签不能充分表达语义性的时候,就可以借助role来说明. 通常这种情况出现在一些自定义的组件上,这样可增强组件的可访问性.可用性和可交互性. role的作用是描 ...
- IIS服务器和xampp中的appche服务器端口冲突解决办法
今天在启动xampp中的appche的时候,发现以前能起来的现在起不来了.想到可能是最近配置的系统自带的IIS服务器把appche的端口给占用了. (appche和iis的默认端口号都是:80:) 问 ...
- sed的应用
h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...
- ArcGIS 地图性能优化系列一
经常有客户会咨询到如何提高地图的显示性能.为何ArcMap刷新地图那么缓慢.为何地图服务响应要等待10多秒? 诸如这些问题,虽然它们的表象都是相似的,但是往往在分析排查问题的时候,我们发现背后的原因是 ...
- Golang Web开发时前端出现谜之空白换行的坑
在使用Golang做Web开发时,有时候渲染出来的模板在前台显示时会出现一些奇怪的空白换行,具体特征就是查看css样式表并没有相关定义的空白部分. 分析: 查看出现问题页面的网页源代码,复制空白换行部 ...