基于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 的 with 语句详解
Jun 13 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
python不同系统中打开方法
Jun 23 Python
聊聊python中的异常嵌套
Sep 01 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
Django与数据库交互的实现
Jun 03 Python
尝试使用Python爬取城市租房信息
Apr 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
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
JavaScript中的各种操作符使用总结
2016/05/26 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
Python常用列表数据结构小结
2014/08/06 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
python 简单的绘图工具turtle使用详解
2017/06/21 Python
Python 处理数据的实例详解
2017/08/10 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
养殖人员的创业计划书范文
2013/12/26 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
python字典的元素访问实例详解
2021/07/21 Python