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.
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()
É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.
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.
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 :
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!