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分析git log日志示例
Feb 27 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
详解Python:面向对象编程
Apr 10 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
为什么说Python可以实现所有的算法
Oct 04 Python
基于python+selenium的二次封装的实现
Jan 06 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
Jan 21 Python
Python中包的用法及安装
Feb 11 Python
Python自动化测试中yaml文件读取操作
Aug 20 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
总结PHP中初始化空数组的最佳方法
2019/02/13 PHP
javascript中判断一个值是否在数组中并没有直接使用
2012/12/17 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
Angularjs---项目搭建图文教程
2016/07/08 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
React数据传递之组件内部通信的方法
2017/12/31 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
vue+element实现图片上传及裁剪功能
2020/06/29 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
用pycharm开发django项目示例代码
2018/10/24 Python
python批量修改ssh密码的实现
2019/08/08 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
keras中的卷积层&池化层的用法
2020/05/22 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
scrapy-splash简单使用详解
2021/02/21 Python
学生保证书范文
2014/04/28 职场文书
上课不认真检讨书
2014/09/17 职场文书
新兵入伍决心书
2015/09/22 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers