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编写一个简单的Lisp解释器的教程
Apr 03 Python
构建Python包的五个简单准则简介
Jun 15 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
opencv python 基于KNN的手写体识别的实例
Aug 03 Python
python2.7和NLTK安装详细教程
Sep 19 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
wxPython实现整点报时
Nov 18 Python
python模拟点击网页按钮实现方法
Feb 25 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
Python使用pycharm导入pymysql教程
Sep 16 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 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
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
php常用数学函数汇总
2014/11/21 PHP
php使用类继承解决代码重复的问题
2015/02/11 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
深入理解Python中的*重复运算符
2017/10/28 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
解析python的局部变量和全局变量
2019/08/15 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
Python通过文本和图片生成词云图
2020/05/21 Python
Django使用rest_framework写出API
2020/05/21 Python
在 Python 中使用 MQTT的方法
2020/08/18 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
学校对教师的评语
2014/04/28 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
办护照工作证明
2014/10/01 职场文书
婚宴致辞
2015/07/28 职场文书
python中sys模块的介绍与实例
2021/04/17 Python
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电