基于Python 裝飾器裝飾類中的方法實例
title: Python 裝飾器裝飾類中的方法
comments: true
date: 2017-04-17 20:44:31
tags: ['Python', 'Decorate']
category: ['Python']
---
目前在中文網(wǎng)上能搜索到的絕大部分關(guān)于裝飾器的教程,都在講如何裝飾一個普通的函數(shù)。本文介紹如何使用Python的裝飾器裝飾一個類的方法,同時在裝飾器函數(shù)中調(diào)用類里面的其他方法。本文以捕獲一個方法的異常為例來進行說明。
有一個類Test, 它的結(jié)構(gòu)如下:
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(),這個方法在多個地方被調(diào)用。由于某些原因,方法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。
使用裝飾器來解決這個問題,裝飾器函數(shù)應該寫在類里面還是類外面呢?答案是,寫在類外面。那么既然寫在類外面,如何調(diào)用這個類的其他方法呢?
首先寫出一個最常見的處理異常的裝飾器:
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()的異常,但是如果在發(fā)生異常的時候,需要調(diào)用類里面的另一個方法來處理異常,這又應該怎么辦?答案是給wrapper增加一個參數(shù):self.
代碼變?yōu)槿缦滦问剑?/strong>
def catch_exception(origin_func): def wrapper(self, *args, **kwargs): try: u = origin_func(self, *args, **kwargs) return u except Exception: self.revive() #不用顧慮,直接調(diào)用原來的類的方法 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.
只需要修改裝飾器定義的部分,使用裝飾器的地方完全不需要做修改。
下圖為正常運行時的運行結(jié)果:
下圖為發(fā)生異常以后捕獲并處理異常:
通過添加一個self參數(shù),類外面的裝飾器就可以直接使用類里面的各種方法,也可以直接使用類的屬性。
以上這篇基于Python 裝飾器裝飾類中的方法實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
django利用request id便于定位及給日志加上request_id
這篇文章主要介紹了django利用request id便于定位及給日志加上request_id的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用django具有一定的參考學習價值,需要的朋友們下面來一起看看吧2018-08-08Python網(wǎng)絡(luò)請求之Requests庫的高級功能運用
在這篇文章中我們將進一步深入學習Requests庫的高級功能,包括處理重定向,設(shè)置超時,處理大文件以及錯誤和異常處理,需要的朋友可以參考下2023-08-08Python實現(xiàn)批量壓縮文件/文件夾zipfile的使用
本文主要介紹了Python實現(xiàn)批量壓縮文件/文件夾zipfile的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09進行數(shù)據(jù)處理的6個?Python?代碼塊分享
這篇文章主要介紹了進行數(shù)據(jù)處理6個Python代碼塊的分享,分享內(nèi)容有選取有空值的行、快速替換列值、對列進行分區(qū)、將一列分為多列等內(nèi)容,需要的朋友可以參考一下2022-04-04