python利用装饰器进行运算的实例分析


Posted in Python onAugust 04, 2015

今天想用python的装饰器做一个运算,代码如下

>>> def mu(x):
  def _mu(*args,**kwargs):
    return x*x
  return _mu

>>> @mu
def test(x,y):
  print '%s,%s' %(x,y)

>>> test(3,5)

Traceback (most recent call last):
 File "<pyshell#111>", line 1, in <module>
  test(3,5)
 File "<pyshell#106>", line 3, in _mu
  return x*x
TypeError: unsupported operand type(s) for *: 'function' and 'function'

原来是不能这样弄的  函数与函数是不能运算的啊!

怎么办呢?

In [1]: from functools import wraps

In [2]: def mu(x):
  ...:     @wraps(x)
  ...:     def _mu(*args,**kwargs):
  ...:             x,y=args
  ...:             return x*x
  ...:     return _mu
  ...: 

In [3]: @mu
  ...: def test(x,y):
  ...:     print '%s,%s' %(x,y)
  ...:   

In [4]: test(3,4)
Out[4]: 9

Python装饰器(decorator)在实现的时候,有一些细节需要被注意。例如,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变)

Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和docstring。

以上所述就是本文的 全部内容了,希望大家能够喜欢。

Python 相关文章推荐
python re正则表达式模块(Regular Expression)
Jul 16 Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
使用C++扩展Python的功能详解
Jan 12 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
Pytorch 实现权重初始化
Dec 31 Python
pymysql的简单封装代码实例
Jan 08 Python
在 Python 中接管键盘中断信号的实现方法
Feb 04 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
在keras里实现自定义上采样层
Jun 28 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 Python
浅谈python多线程和队列管理shell程序
Aug 04 #Python
python中使用序列的方法
Aug 03 #Python
python实现备份目录的方法
Aug 03 #Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 #Python
浅谈Python中列表生成式和生成器的区别
Aug 03 #Python
详解Python3中的Sequence type的使用
Aug 01 #Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 #Python
You might like
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
编写PHP的安全策略
2006/10/09 PHP
Snoopy类使用小例子
2008/04/15 PHP
处理php自动反斜杠的函数代码
2010/01/05 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
2017/11/19 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
python单例模式实例分析
2015/04/08 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
python如何定义带参数的装饰器
2018/03/20 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
python反扒机制的5种解决方法
2021/02/06 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
HTML5实现签到 功能
2018/10/09 HTML / CSS
优秀导游先进事迹材料
2014/01/25 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
Python多个MP4合成视频的实现方法
2021/07/16 Python