基于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中关于使用模块的基础知识
May 24 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
Jan 07 Python
python 处理telnet返回的More,以及get想要的那个参数方法
Feb 14 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
python递归法解决棋盘分割问题
Jul 17 Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 Python
pycharm不能运行.py文件的解决方法
Feb 12 Python
sklearn的predict_proba使用说明
Jun 28 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
opencv实现图像几何变换
Mar 24 Python
判断Python中的Nonetype类型
May 25 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
JAVA/JSP学习系列之二
2006/10/09 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
防止文件缓存的js代码
2013/01/10 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
js html实现计算器功能
2018/11/13 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
Python实现线程池代码分享
2015/06/21 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
Python 如何在字符串中插入变量
2020/08/01 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
Java文件和目录(IO)操作
2014/08/26 面试题
农民工工资承诺书范文
2014/03/31 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
大学生党员自我剖析材料
2014/10/06 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
法律意见书范文
2015/05/20 职场文书
音乐之声观后感
2015/06/04 职场文书