展开全部

Python 装饰2113器装饰类中的方法

目前在中文网上能5261搜索到的绝大部分关于4102装饰器的教程,都在讲如何装饰一个1653普通的函数。本文介绍如何使用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.

只需要修改装饰器定义的部分,使用装饰器的地方完全不需要做修改。

下图为正常运行时的运行结果:

下图为发生异常以后捕获并处理异常:

通过添加一个self参数,类外面的装饰器就可以直接使用类里面的各种方法,也可以直接使用类的属性。

python装饰器class_PYTHON里的装饰器能装饰类吗相关推荐

  1. python装饰器class_Python中的各种装饰器详解

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  2. python装饰器class_python装饰器2:类装饰器

    本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你如何认为取决于你,两种说法都有出现在其它的文章中.我的文章 ...

  3. 如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰

    需求:定义一个装饰器,既可以装饰有参数的方法,又可以装饰没有参数的方法,既可以装饰有返回值的方法,又可以装饰没有返回值的方法 代码如下: def decorate(test): #定义一个装饰器函数d ...

  4. python装饰器与闭包_python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)。...

    转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...

  5. python闭包和装饰器的区别_python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)。(转)...

    呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编程的概念,当然还有理解在python中定义和调用函数 ...

  6. SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理

    SIGIA_4P python学习 列表 字典 集合 面对对象编程 闭包 装饰器 函数式编程 作用域 异常处理 本文连接 简介 SIGIA_4P 网址 a. 课程OKR Objectives and ...

  7. python基础篇大合集,进程、装饰器、列表详解篇!

    进程以及状态 1. 进程 2. 进程的状态 进程的创建-multiprocessing 1. 创建进程 2. 进程pid 3. Process语法结构如下 4. 给子进程指定的函数传递参数 5. 进程 ...

  8. python基础篇大合集,进程、装饰器、列表详解篇

    1. 进程 程序:例如xxx.py这是程序,是一个静态的 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元. 不仅可以通过线程完成多任务,进程也是可以的 2. 进 ...

  9. Python之路【第十七篇】:装饰器

    写代码的时候有一个原则,开放封闭原则(面向对象):对某些东西开放,对某些封闭,在装饰器这里,函数内部是封闭的,不允许改变函数的内部. 装饰器用来装饰函数,可以让函数在执行之前或者执行之后,做一些操作, ...

最新文章

  1. python小游戏代码大全-python小游戏实现代码
  2. selenium如何在同一个窗口页面中返回上一个页面窗口(Python)。
  3. 软件工程(2019)第四次作业-结队作业
  4. AI:IPPR的数学表示-CNN稀疏结构进化(Mobile、xception、Shuffle、SE、Dilated、Deformable)
  5. java中process方法用处_Java中ProcessBuilder应用实例
  6. 服务器网站管理页面打不开解决方法
  7. LeetCode 63.不同路径II(动态规划)
  8. 苹果Mac 3D 模型展开工具:Unfolder
  9. 软件有计算机id如何生成注册号码,苹果账号注册方法:如何申请苹果id账号
  10. 计算机专硕毕业论文写什么,最新硕士毕业论文进度安排怎么写
  11. 像人类大脑一样思考 ,“袋鼠云防汛大脑”让防汛更智慧
  12. 图片下载_二维码生成
  13. 从 RHEL 6 升级至 RHEL 7
  14. 字符串连接 (c语言)
  15. 超级计算机 天河三号,中国新一代百亿亿次超算“天河三号”问世!再创世界纪录...
  16. CAD版本转换知识大全
  17. Python自然语言处理(3):更多词汇关系:部分、整体、集合、蕴含等
  18. Pyinstaller 打包 Pytest项目及资源文件
  19. [第三篇] PostGIS:“我让PG更完美”
  20. java使用aes加密文件内容

热门文章

  1. malloc和free
  2. 27日直播预告丨Oracle运营商行业生产实践分享
  3. Oracle 21C 新特性:数据泵相关新特性汇总
  4. HDFS源码解析:教你用HDFS客户端写数据
  5. 换个角度思考勒索攻击事件
  6. JavaScript回调函数的高手指南
  7. 中俄国际社区大佬共话Java,苦Lambda表达式久矣?
  8. 【华为云技术分享】python教程:猴子补丁
  9. 设计模式的C语言应用-观察者模式-第四章
  10. Vue3+Vant+Vue-cli+Restful api实战—图书商城移动端