基于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浅复制中对象生存周期实例分析
Apr 02 Python
解决Python3.5+OpenCV3.2读取图像的问题
Dec 05 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
python3实现zabbix告警推送钉钉的示例
Feb 20 Python
python批量创建指定名称的文件夹
Mar 21 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 Python
python 经典数字滤波实例
Dec 16 Python
浅谈python之自动化运维(Paramiko)
Jan 31 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 Python
python des,aes,rsa加解密的实现
Jan 16 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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
德生PL550的电路分析
2021/03/02 无线电
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
js过滤数组重复元素的方法
2010/09/05 Javascript
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
在python里面运用多继承方法详解
2019/07/01 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
特步官方商城:Xtep
2017/03/21 全球购物
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
外企C语言笔试题
2013/11/10 面试题
.NET面试10题
2014/02/24 面试题
Java程序开发中如何应用线程
2016/03/03 面试题
如何安装ruby on rails
2014/02/09 面试题
师德师风自查材料
2014/10/14 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
党支部鉴定意见
2015/06/02 职场文书