python装饰器相当于函数的调用方式


Posted in Python onDecember 27, 2019

1. 普通装饰器

import logging
 
 1. foo = use_loggine(foo)
 def use_loggine(func):
 def wrapper():
  logging.warn("%s is running " % func.__name__)
  return func()
 return wrapper
 
 @use_loggine
 def foo():
 print "aaa"
 foo()
 print foo.__name__

2. func 需要参数:

foo = use_loggine(foo) 第一个参数就是func这个函数对象,不包含参数foo(params)

 def use_loggine(func):
 def wrapper(name):
  logging.warn("%s is running " % func.__name__)
  return func(name)
 return wrapper
 
 
 @use_loggine
 def foo(name):
 print "name is %s" % name

3. 装饰器带参数

foo = use_logging('warn')(foo) 还是把被装饰的函数当做参数赋给装饰器

 def use_logging(level):
 def decorator(func):
 def wrapper(*args, **kwargs):
  if level == 'warn':
  logging.warn("%s is running" % func.__name__)
  elif level == 'info':
  logging.warn("%s is running" % func.__name__)
  return func(*args)
 return wrapper
 return decorator
 
 @use_logging('warn')
 def foo(name):
 print "i am %s" % name
 
 foo = use_logging('warn')(foo)
 print foo.__name__
 foo('foo')

4. 类装饰器,还是把被装饰的函数当做参数赋给装饰器

foo = Foo(params)(func)
 
 class Foo(object):
 def __init__(self, name):
 self.name = name
 
 def __call__(self, func):
 def aa():
  print "class decorator running"
  print "name is :%s" % self.name
  func()
  print 'class decorator ending'
 return aa

 @Foo("hello")
 def bar():
 print "world"
 
 bar()
 
 @deco
 def foo()
 pass
 
 foo = deco(foo)
 
 @deco(xx)
 def foo():
 pass
 
 foo = deco(xx)(foo)

5. 类方法装饰器

类方法装饰器和其他装饰器没有什么区别,只不过在装饰器内部返回的函数中,第一个参数是固定的,是调用方法的对象本身,如

果是实例对象,就是self,是类方法的话,就是cls,静态方法的话,没有第一个参数。

from functools import wraps

 
 def method_decor(func):
 @wraps(func)
 def wrapper(*args, **kwargs):
  try:
  u = func(*args, **kwargs)
  return u
  except Exception as e:
  args[0].bb() # args[0]就是self或者cls。可以在args前面定义self,更加方便u = func(self,*args, **kwargs)
  return 'an Exception raised.'
 
 return wrapper
 
 
 class Foo(object):
 
 @method_decor
 def aa(self):
  # print("This is wraped method")
  raise Exception('aa')
 
 def bb(self):
  print("This is called method")
 
 
 
 a = Foo()
 a.aa()

以上这篇python装饰器相当于函数的调用方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中使用xlrd、xlwt操作excel表格详解
Jan 29 Python
Python常用内置函数总结
Feb 08 Python
详解Python2.x中对Unicode编码的使用
Apr 03 Python
python实现图片中文字分割效果
Jul 22 Python
Python @property使用方法解析
Sep 17 Python
PYTHON绘制雷达图代码实例
Oct 15 Python
python 协程 gevent原理与用法分析
Nov 22 Python
简单了解python调用其他脚本方法实例
Mar 26 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
python中的列表和元组区别分析
Dec 30 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
Python 实现数组相减示例
Dec 27 #Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 #Python
Pandas实现DataFrame按行求百分数(比例数)
Dec 27 #Python
pandas的相关系数与协方差实例
Dec 27 #Python
详解opencv中画圆circle函数和椭圆ellipse函数
Dec 27 #Python
如何更改 pandas dataframe 中两列的位置
Dec 27 #Python
使用OpenCV circle函数图像上画圆的示例代码
Dec 27 #Python
You might like
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
从手册去理解分析PHP session机制
2011/07/17 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
对frameset、frame、iframe的js操作示例代码
2013/08/16 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
JavaScript实现获取dom中class的方法
2015/02/09 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
拖动时防止选中
2017/02/03 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python中日志logging模块的性能及多进程详解
2017/07/18 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
学习心得体会
2014/01/01 职场文书
社区两委对照检查材料
2014/08/23 职场文书
旷课检讨书范文
2015/01/27 职场文书
班委竞选稿范文
2015/11/21 职场文书
《三国志》赏析
2019/08/27 职场文书