亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于Python 裝飾器裝飾類中的方法實(shí)例

 更新時(shí)間:2018年04月21日 14:28:25   作者:hesi9555  
下面小編就為大家分享一篇基于Python 裝飾器裝飾類中的方法實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

title: Python 裝飾器裝飾類中的方法

comments: true
date: 2017-04-17 20:44:31
tags: ['Python', 'Decorate']
category: ['Python']
---

目前在中文網(wǎng)上能搜索到的絕大部分關(guān)于裝飾器的教程,都在講如何裝飾一個(gè)普通的函數(shù)。本文介紹如何使用Python的裝飾器裝飾一個(gè)類的方法,同時(shí)在裝飾器函數(shù)中調(diào)用類里面的其他方法。本文以捕獲一個(gè)方法的異常為例來(lái)進(jìn)行說(shuō)明。

有一個(gè)類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.

在類中有一個(gè)方法read_value(),這個(gè)方法在多個(gè)地方被調(diào)用。由于某些原因,方法read_value有可能隨機(jī)拋出Exception導(dǎo)致程序崩潰。所以需要對(duì)整個(gè)方法做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()

這樣寫雖然可以解決問(wèn)題,但是代碼不Pythonic。

使用裝飾器來(lái)解決這個(gè)問(wèn)題,裝飾器函數(shù)應(yīng)該寫在類里面還是類外面呢?答案是,寫在類外面。那么既然寫在類外面,如何調(diào)用這個(gè)類的其他方法呢?

首先寫出一個(gè)最常見(jiàn)的處理異常的裝飾器:

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.

這種寫法,確實(shí)可以捕獲到origin_func()的異常,但是如果在發(fā)生異常的時(shí)候,需要調(diào)用類里面的另一個(gè)方法來(lái)處理異常,這又應(yīng)該怎么辦?答案是給wrapper增加一個(gè)參數(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)用原來(lái)的類的方法
   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.

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

下圖為正常運(yùn)行時(shí)的運(yùn)行結(jié)果:

下圖為發(fā)生異常以后捕獲并處理異常:

通過(guò)添加一個(gè)self參數(shù),類外面的裝飾器就可以直接使用類里面的各種方法,也可以直接使用類的屬性。

以上這篇基于Python 裝飾器裝飾類中的方法實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python數(shù)據(jù)分析之公交IC卡刷卡分析

    python數(shù)據(jù)分析之公交IC卡刷卡分析

    這篇文章主要介紹了python數(shù)據(jù)分析之公交IC卡,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • python 字典訪問(wèn)的三種方法小結(jié)

    python 字典訪問(wèn)的三種方法小結(jié)

    今天小編就為大家分享一篇python 字典訪問(wèn)的三種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 使用Numpy打亂數(shù)組或打亂矩陣行

    使用Numpy打亂數(shù)組或打亂矩陣行

    這篇文章主要介紹了使用Numpy打亂數(shù)組或打亂矩陣行問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 深入詳解Python中dotted庫(kù)的使用

    深入詳解Python中dotted庫(kù)的使用

    Python的dotted庫(kù)提供了一種便捷的方式來(lái)處理嵌套字典和列表,允許通過(guò)點(diǎn)分隔的路徑字符串來(lái)訪問(wèn)和設(shè)置嵌套結(jié)構(gòu)中的數(shù)據(jù),下面我們就來(lái)看看它的具體使用
    2019-04-04
  • django利用request id便于定位及給日志加上request_id

    django利用request id便于定位及給日志加上request_id

    這篇文章主要介紹了django利用request id便于定位及給日志加上request_id的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2018-08-08
  • Scrapy之迭代爬取網(wǎng)頁(yè)中失效問(wèn)題及解決

    Scrapy之迭代爬取網(wǎng)頁(yè)中失效問(wèn)題及解決

    這篇文章主要介紹了Scrapy之迭代爬取網(wǎng)頁(yè)中失效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python網(wǎng)絡(luò)請(qǐng)求之Requests庫(kù)的高級(jí)功能運(yùn)用

    Python網(wǎng)絡(luò)請(qǐng)求之Requests庫(kù)的高級(jí)功能運(yùn)用

    在這篇文章中我們將進(jìn)一步深入學(xué)習(xí)Requests庫(kù)的高級(jí)功能,包括處理重定向,設(shè)置超時(shí),處理大文件以及錯(cuò)誤和異常處理,需要的朋友可以參考下
    2023-08-08
  • Python線程障礙對(duì)象Barrier原理詳解

    Python線程障礙對(duì)象Barrier原理詳解

    這篇文章主要介紹了Python線程障礙對(duì)象Barrier原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python實(shí)現(xiàn)批量壓縮文件/文件夾zipfile的使用

    Python實(shí)現(xiàn)批量壓縮文件/文件夾zipfile的使用

    本文主要介紹了Python實(shí)現(xiàn)批量壓縮文件/文件夾zipfile的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 進(jìn)行數(shù)據(jù)處理的6個(gè)?Python?代碼塊分享

    進(jìn)行數(shù)據(jù)處理的6個(gè)?Python?代碼塊分享

    這篇文章主要介紹了進(jìn)行數(shù)據(jù)處理6個(gè)Python代碼塊的分享,分享內(nèi)容有選取有空值的行、快速替換列值、對(duì)列進(jìn)行分區(qū)、將一列分為多列等內(nèi)容,需要的朋友可以參考一下
    2022-04-04

最新評(píng)論