基于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 enumerate遍历数组示例应用
Sep 06 Python
python 循环while和for in简单实例
Aug 16 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
Python根据成绩分析系统浅析
Feb 11 Python
Python3的高阶函数map,reduce,filter的示例详解
Jul 23 Python
python tkinter图形界面代码统计工具
Sep 18 Python
python实现KNN分类算法
Oct 16 Python
python 装饰器的实际作用有哪些
Sep 07 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
Python音乐爬虫完美绕过反爬
Aug 30 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
2013/08/01 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
PHP的Yii框架中View视图的使用进阶
2016/03/29 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
python使用post提交数据到远程url的方法
2015/04/29 Python
opencv改变imshow窗口大小,窗口位置的方法
2018/04/02 Python
Python3实现汉语转换为汉语拼音
2019/07/08 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
python3 kubernetes api的使用示例
2021/01/12 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
技术总监的工作职责
2013/11/13 职场文书
护理专业应届毕业生推荐信
2013/11/15 职场文书
财产保全担保书
2015/01/20 职场文书
党支部评议意见
2015/06/02 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS