基于Python 装饰器装饰类中的方法实例


Posted in Python onApril 21, 2018

title: Python 装饰器装饰类中的方法

comments: true
date: 2017-04-17 20:44:31
tags: ['Python', 'Decorate']
category: ['Python']
---

目前在中文网上能搜索到的绝大部分关于装饰器的教程,都在讲如何装饰一个普通的函数。本文介绍如何使用Python的装饰器装饰一个类的方法,同时在装饰器函数中调用类里面的其他方法。本文以捕获一个方法的异常为例来进行说明。

有一个类Test, 它的结构如下:

class Test(object):
 def __init__(self):
  pass
 def revive(self):
  print('revive from exception.')
  # do something to restore
 def read_value(self):
  print('here I will do something.')
  # do something.

在类中有一个方法read_value(),这个方法在多个地方被调用。由于某些原因,方法read_value有可能随机抛出Exception导致程序崩溃。所以需要对整个方法做try ... except处理。最丑陋的做法如下面的代码所示:

class Test(object):
 def __init__(self):
  pass
 def revive(self):
  print('revive from exception.')
  # do something to restore
 def read_value(self):
  try:
   print('here I will do something.')
   # do something.
  except Exception as e:
   print(f'exception {e} raised, parse exception.')
   # do other thing.
   self.revive()

这样写虽然可以解决问题,但是代码不Pythonic。

使用装饰器来解决这个问题,装饰器函数应该写在类里面还是类外面呢?答案是,写在类外面。那么既然写在类外面,如何调用这个类的其他方法呢?

首先写出一个最常见的处理异常的装饰器:

def catch_exception(origin_func):
 def wrapper(*args, **kwargs):
  try:
   u = origin_func(*args, **kwargs)
   return u
  except Exception:
   return 'an Exception raised.'
 return wrapper
class Test(object):
 def __init__(self):
  pass
 def revive(self):
  print('revive from exception.')
  # do something to restore
 @catch_exception
 def read_value(self):
  print('here I will do something.')
  # do something.

这种写法,确实可以捕获到origin_func()的异常,但是如果在发生异常的时候,需要调用类里面的另一个方法来处理异常,这又应该怎么办?答案是给wrapper增加一个参数:self.

代码变为如下形式:

def catch_exception(origin_func):
 def wrapper(self, *args, **kwargs):
  try:
   u = origin_func(self, *args, **kwargs)
   return u
  except Exception:
   self.revive() #不用顾虑,直接调用原来的类的方法
   return 'an Exception raised.'
 return wrapper
class Test(object):
 def __init__(self):
  pass
 def revive(self):
  print('revive from exception.')
  # do something to restore
 @catch_exception
 def read_value(self):
  print('here I will do something.')
  # do something.

只需要修改装饰器定义的部分,使用装饰器的地方完全不需要做修改。

下图为正常运行时的运行结果:

基于Python 装饰器装饰类中的方法实例

下图为发生异常以后捕获并处理异常:

基于Python 装饰器装饰类中的方法实例

通过添加一个self参数,类外面的装饰器就可以直接使用类里面的各种方法,也可以直接使用类的属性。

以上这篇基于Python 装饰器装饰类中的方法实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python编写一个简单的FUSE文件系统的教程
Apr 02 Python
windows系统下Python环境的搭建(Aptana Studio)
Mar 06 Python
Anaconda入门使用总结
Apr 05 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
Python 支付整合开发包的实现
Jan 23 Python
pytest中文文档之编写断言
Sep 12 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 Python
解决keras backend 越跑越慢问题
Jun 18 Python
python中 _、__、__xx__()区别及使用场景
Jun 30 Python
Python绘制组合图的示例
Sep 18 Python
教你使用Pandas直接核算Excel中快递费用
May 12 Python
使用python装饰器计算函数运行时间的实例
Apr 21 #Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 #Python
Python 实现一行输入多个值的方法
Apr 21 #Python
Python实现接受任意个数参数的函数方法
Apr 21 #Python
深入分析python数据挖掘 Json结构分析
Apr 21 #Python
Python编程中NotImplementedError的使用方法
Apr 21 #Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 #Python
You might like
用Socket发送电子邮件
2006/10/09 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
jQuery '行 4954 错误: 不支持该属性或方法' 的问题解决方法
2011/01/19 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
使用jquery解析XML的方法
2014/09/05 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
jQuery中事件与动画的总结分享
2016/05/24 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
Python使用pymysql小技巧
2017/06/04 Python
python assert的用处示例详解
2019/04/01 Python
python+OpenCV实现图像拼接
2020/03/05 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
python绘制汉诺塔
2021/03/01 Python
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
银行员工职业规划范文
2014/01/21 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
初中政治教师教学反思
2016/02/23 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书