基于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 七种邮件内容发送方法实例
Apr 22 Python
Python编写生成验证码的脚本的教程
May 04 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
Python实现翻转数组功能示例
Jan 12 Python
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
对Python实现累加函数的方法详解
Jan 23 Python
Python下简易的单例模式详解
Apr 08 Python
感知器基础原理及python实现过程详解
Sep 30 Python
PyTorch中反卷积的用法详解
Dec 30 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
Python如何telnet到网络设备
Feb 18 Python
基于Python实现将列表数据生成折线图
Mar 23 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
教你如何把一篇文章按要求分段
2006/10/09 PHP
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
显示js对象所有属性和方法的函数
2009/10/16 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
JointJS JavaScript流程图绘制框架解析
2019/08/15 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
详解Python中的条件判断语句
2015/05/14 Python
python采集百度百科的方法
2015/06/05 Python
Python找出9个连续的空闲端口
2016/02/01 Python
python实现八大排序算法(1)
2017/09/14 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
python3注册全局热键的实现
2020/03/22 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
一个SQL面试题
2014/08/21 面试题
一套软件测试笔试题
2014/07/25 面试题
企业安全生产责任书
2014/04/14 职场文书
保密工作目标责任书
2014/07/28 职场文书
社区务虚会发言材料
2014/10/20 职场文书
八月迷情观后感
2015/06/11 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android