Un résumé des méthodes de réflexion telles que la création dynamique d'une instance en Python, l'acquisition d'une méthode et son appel.
Si vous souhaitez créer dynamiquement une instance à partir d'une chaîne de caractères en Python, procédez comme suit.
mod = __import__("exceptions",fromlist=["Exception"])
class_def = getattr(mod,"Exception")
obj = class_def("message") # obj = Exception('message',)
Le début «import» correspond à la déclaration d'importation (dans l'exemple ci-dessus, il a la même signification que l'exécution de «à partir d'exceptions import Exception». Il n'est pas nécessaire de lire explicitement les exceptions. Ce n'est qu'un exemple. Est).
Récupérez la définition de classe de la classe correspondante à partir de ce module par getattr
, et créez enfin un objet en l'utilisant.
Référence
How to dynamically load a Python class
Utilisez inspect pour obtenir la définition de la classe comprenant la méthode.
ʻInspect.getmembersobtient la définition,
getattrobtient la définition de l'objet et il est exécuté. Bien sûr, vous pouvez appeler
getattr` directement si le nom de la méthode a un hit à l'avance.
upper_method = filter(lambda f: f[0] == "upper", inspect.getmembers("String",inspect.isroutine))[0]
invoker = getattr("abc",upper_method[0])
invoker() # 'ABC'
C'est un espoir naturel que je ne veuille prendre que ceux avec des décorateurs, mais pour le moment [méthodes très boueuses](http://stackoverflow.com/questions/5910703/howto-get-all-methods-of- Il semble qu'il n'y ait que (une-classe-python-avec-un-décorateur-donné) (en particulier, on a l'impression de lire le code source et de chercher le début @).
Si vous souhaitez obtenir toutes les propriétés publiques (variables membres), procédez comme suit.
attributes = inspect.getmembers(self, lambda a: not(inspect.isroutine(a)))
filter(lambda a: not(a[0].startswith("__")), attributes)
Celles qui ne correspondent pas à ʻisroutine = Les variables membres sont extraites, et celles dont les noms ne commencent pas par
__sont extraites. Pour obtenir la valeur de la propriété obtenue, utilisez
getattr` ainsi que la méthode.
Recommended Posts