国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

基于Python 裝飾器裝飾類中的方法實例

2020-02-22 23:47:35
字體:
來源:轉載
供稿:網友

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 wrapperclass 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 wrapperclass 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.

只需要修改裝飾器定義的部分,使用裝飾器的地方完全不需要做修改。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绥德县| 万州区| 五莲县| 钟祥市| 龙游县| 芜湖县| 吉林省| 长海县| 安吉县| 竹北市| 始兴县| 芦溪县| 乌苏市| 神农架林区| 广平县| 云梦县| 桂林市| 岳西县| 镇平县| 湖南省| 大足县| 咸宁市| 定结县| 澄城县| 布尔津县| 瑞安市| 巴林左旗| 黑龙江省| 甘南县| 丹巴县| 池州市| 绥阳县| 肇州县| 华蓥市| 林芝县| 民丰县| 宜川县| 米脂县| 寿宁县| 乳源| 沂南县|