Méthodes de décoration dans les classes basées sur les décorateurs Python

不言
Libérer: 2018-04-21 14:50:53
original
2244 Les gens l'ont consulté

Ce qui suit est un exemple de méthode dans une classe de décoration basée sur des décorateurs Python. Elle a une bonne valeur de référence et j'espère qu'elle sera utile à tout le monde. Jetons un coup d'oeil ensemble

titre : Méthodes dans les classes de décoration de décorateur Python

commentaires : vrai
date : 2017-04-17 20:44 : 31
tags : ['Python', 'Decorate']
catégorie : ['Python']
---

La plupart des informations sur les tutoriels Decorator parlent toutes de la façon de décorer un objet ordinaire. fonction. Cet article explique comment utiliser le décorateur de Python pour décorer une méthode de classe et appeler d'autres méthodes de la classe dans la fonction décorateur. Cet article prend la capture d’une exception d’une méthode comme exemple pour illustrer.

possède une classe Test, sa structure est la suivante :

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.
Copier après la connexion

in Il existe une méthode read_value() dans la classe, qui est appelée à plusieurs endroits. Pour certaines raisons, la méthode read_value peut lancer une exception de manière aléatoire et provoquer le crash du programme. Vous devez donc essayer... sauf le traitement sur l'ensemble de la méthode. L'approche la plus laide est présentée dans le code suivant :

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()
Copier après la connexion

Écrire comme ceci peut résoudre le problème, mais le code n'est pas pythonique.

Utilisez des décorateurs pour résoudre ce problème. La fonction décorateur doit-elle être écrite à l'intérieur de la classe ou en dehors de la classe ? La réponse est : écrivez-le en dehors de la classe. Alors comme c’est écrit en dehors de la classe, comment appeler les autres méthodes de cette classe ?

Écrivez d'abord l'un des décorateurs de gestionnaires d'exceptions les plus courants :

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.
Copier après la connexion

Cette façon d'écrire peut en effet capturer l'exception de origin_func(), mais que devons-nous faire si nous devons appeler une autre méthode de la classe pour gérer l'exception lorsqu'une exception se produit ? La réponse est d'ajouter un paramètre au wrapper : self.

Le code devient le suivant :

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.
Copier après la connexion

Seule la partie définie par le décorateur doit être modifiée, et aucune modification n'est requise là où le décorateur est utilisé.

L'image suivante montre les résultats d'exécution en fonctionnement normal :

L'image suivante montre la capture après qu'une exception se produit Et gérer les exceptions :

En ajoutant un paramètre self, le décorateur en dehors de la classe peut utiliser directement diverses méthodes de la classe, ou utiliser directement les attributs de la classe.

Recommandations associées :

décorateur python - méthode pour limiter le nombre d'appels de fonction (appel une fois toutes les 10 secondes)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal