基于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中的super()方法使用简介
Aug 14 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
Jan 20 Python
Python编程中对文件和存储器的读写示例
Jan 25 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
python爬取哈尔滨天气信息
Jul 14 Python
wxPython多个窗口的基本结构
Nov 19 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
Python中三维坐标空间绘制的实现
Sep 22 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 Python
FP-growth算法发现频繁项集——发现频繁项集
Jun 24 Python
Pandas-DataFrame知识点汇总
Mar 16 Python
python游戏开发之pygame实现接球小游戏
Apr 22 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
win2003服务器使用WPS的COM组件的一些问题解决方法
2012/01/11 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
发现的以前不知道的函数
2006/09/19 Javascript
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
Vue header组件开发详解
2018/01/26 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
Vue实现手机计算器
2020/08/17 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
使用Python绘制图表大全总结
2017/02/11 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
python图形用户接口实例详解
2019/12/16 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
欢迎标语大全
2014/06/21 职场文书
获奖感言范文
2015/07/31 职场文书
红领巾广播站广播稿
2015/08/19 职场文书
Python学习之包与模块详解
2022/03/19 Python
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python