Réflexion en Python

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.

Instanciation dynamique

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

Obtenir la définition de méthode

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 appelergetattr` 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 @).

Obtenir des propriétés

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, utilisezgetattr` ainsi que la méthode.

Recommended Posts

Réflexion en Python
Réflexion en Python
Quadtree en Python --2
Python en optimisation
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
FizzBuzz en Python
Sqlite en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Liste triée en Python
AtCoder # 36 quotidien avec Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python
Daily AtCoder # 18 en Python
Motif singleton en Python
Opérations sur les fichiers en Python
Séquence de touches en Python
Daily AtCoder # 33 en Python
Distribution logistique en Python
AtCoder # 7 tous les jours avec Python
Décomposition LU en Python
Une doublure en Python
AtCoder # 24 tous les jours avec Python
classe de cas en python
Implémentation RNN en python
AtCoder # 8 tous les jours avec Python
Traitement de fichiers en Python
Elasticsearch Reindex en Python
Daily AtCoder # 42 en Python
Tri de base en Python
Requête HTTP en Python