基于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使用matplotlib绘制动画的方法
May 20 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
python 定义给定初值或长度的list方法
Jun 23 Python
python画微信表情符的实例代码
Oct 09 Python
Django1.11自带分页器paginator的使用方法
Oct 31 Python
Python TCP通信客户端服务端代码实例
Nov 21 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
Python基于yaml文件配置logging日志过程解析
Jun 23 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
Python操控mysql批量插入数据的实现方法
Oct 27 Python
Python控制鼠标键盘代码实例
Dec 08 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中字符串和正则表达式详解
2014/10/23 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
JavaScript操作 url 中 search 部分方法函数
2016/06/15 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
使用Python开发windows GUI程序入门实例
2014/10/23 Python
Python中类型关系和继承关系实例详解
2015/05/25 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
python编程使用协程并发的优缺点
2018/09/20 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
汇智创新科技发展有限公司
2015/12/06 面试题
文明美德伴我成长演讲稿
2014/05/12 职场文书
计算机毕业生求职信
2014/06/10 职场文书
小学数学教研活动总结
2014/07/01 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
群众路线调研报告范文
2014/11/03 职场文书
打架检讨书范文
2015/01/27 职场文书
高中化学教学反思
2016/02/22 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技