基于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中定义结构体的方法
Mar 04 Python
使用Python开发windows GUI程序入门实例
Oct 23 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
python通过socket实现多个连接并实现ssh功能详解
Nov 08 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
python 实现登录网页的操作方法
May 11 Python
python内存动态分配过程详解
Jul 15 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 Python
django项目中使用云片网发送短信验证码的实现
Jan 19 Python
Python中os模块的简单使用及重命名操作
Apr 17 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
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
php while循环得到循环次数
2013/10/26 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
jQuery实现切换字体大小的方法
2015/03/10 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
vue中render函数的使用详解
2018/10/12 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
python实现telnet客户端的方法
2015/04/15 Python
Python变量和数据类型详解
2017/02/15 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
Python datetime 如何处理时区信息
2020/09/02 Python
Python爬虫回测股票的实例讲解
2021/01/22 Python
新加坡交友网站:be2新加坡
2019/04/10 全球购物
SQL Server笔试题
2012/01/10 面试题
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
初中生三年学习生活的自我评价
2013/11/03 职场文书
北京奥运会主题口号
2014/06/13 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
学习礼仪心得体会
2014/09/01 职场文书
镇政府副镇长群众路线专题民主生活会对照检查材料
2014/09/19 职场文书
李强感恩观后感
2015/06/17 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
JAVA springCloud项目搭建流程
2022/05/11 Java/Android