最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年04月21日 14:28:25   作者:hesi9555  
下面小編就為大家分享一篇基于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導(dǎo)致程序崩潰。所以需要對整個方法做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ù)應(yīng)該寫在類里面還是類外面呢?答案是,寫在類外面。那么既然寫在類外面,如何調(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)用類里面的另一個方法來處理異常,這又應(yīng)該怎么辦?答案是給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)文章

  • 深入理解最新Python中的Match Case

    深入理解最新Python中的Match Case

    最近發(fā)布的 Python 3.10 的所有主要新特性中最重要就是 Match-Case 語法,本文將帶你深入探討,會發(fā)現(xiàn) Match-Case 其實沒有那么簡單
    2021-11-11
  • Python與Redis的連接教程

    Python與Redis的連接教程

    這篇文章主要介紹了Python與Redis的連接教程,Redis是一個高性能的基于內(nèi)存的數(shù)據(jù)庫,需要的朋友可以參考下
    2015-04-04
  • python連接MySQL數(shù)據(jù)庫實例分析

    python連接MySQL數(shù)據(jù)庫實例分析

    這篇文章主要介紹了python連接MySQL數(shù)據(jù)庫,實例分析了Python操作MySQL的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • python屬于軟件嗎

    python屬于軟件嗎

    在本篇內(nèi)容里小編給Python新手整理了關(guān)于python是軟件嗎的相關(guān)知識點,有興趣的朋友們可以閱讀下。
    2020-06-06
  • python?包之?threading?多線程

    python?包之?threading?多線程

    這篇文章主要介紹了python?包之?threading?多線程,文章通過實例化threading.Thread類創(chuàng)建線程,下文相關(guān)資料介紹,需要的朋友可以參考一下
    2022-04-04
  • python 中sys.getsizeof的用法說明

    python 中sys.getsizeof的用法說明

    這篇文章主要介紹了python 中sys.getsizeof的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • CentOS7下python3.7.0安裝教程

    CentOS7下python3.7.0安裝教程

    這篇文章主要為大家詳細介紹了CentOS7下python3.7.0安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Python求字符串的長度示例代碼

    Python求字符串的長度示例代碼

    這篇文章主要介紹了Python求字符串的長度,求一個字符串的長度,在main函數(shù)中輸入字符串,并輸出其長度,文中給大家介紹了Python計算字符串長度的函數(shù),需要的朋友可以參考下
    2023-02-02
  • Python函數(shù)裝飾器的使用詳解

    Python函數(shù)裝飾器的使用詳解

    大家好,本篇文章主要講的是Python函數(shù)裝飾器的使用詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • pycharm導(dǎo)入第三方庫的兩種方法(永不報錯)

    pycharm導(dǎo)入第三方庫的兩種方法(永不報錯)

    這篇文章主要介紹了pycharm導(dǎo)入第三方庫的兩種方法(永不報錯),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11

最新評論

吴川市| 莫力| 获嘉县| 高清| 滁州市| 新泰市| 治县。| 昌邑市| 永登县| 新和县| 平乐县| 深圳市| 洞头县| 铅山县| 望江县| 治多县| 江津市| 吉水县| 北票市| 炉霍县| 六安市| 台安县| 平果县| 涞源县| 通许县| 河东区| 岳池县| 二连浩特市| 肥西县| 潼关县| 交城县| 镇平县| 临沧市| 瑞金市| 遂宁市| 新宾| 恩施市| 铁岭市| 安陆市| 个旧市| 和平区|