Si vous n'avez pas envie de le faire vous-même, il existe une fonction disponible dans l'application pydoc
qui fait exactement cela :
from pydoc import locate
my_class = locate('my_package.my_module.MyClass')
L'avantage de cette approche par rapport aux autres énumérées ici est que locate
trouvera cualquier objet python au niveau du chemin pointé fourni, et pas seulement un objet directement dans un module, par exemple my_package.my_module.MyClass.attr
.
Si vous êtes curieux de savoir quelle est leur recette, voici la fonction :
def locate(path, forceload=0):
"""Locate an object by name or dotted path, importing as necessary."""
parts = [part for part in split(path, '.') if part]
module, n = None, 0
while n < len(parts):
nextmodule = safeimport(join(parts[:n+1], '.'), forceload)
if nextmodule: module, n = nextmodule, n + 1
else: break
if module:
object = module
else:
object = __builtin__
for part in parts[n:]:
try:
object = getattr(object, part)
except AttributeError:
return None
return object
Il s'appuie sur pydoc.safeimport
fonction. Voici la documentation à ce sujet :
"""Import a module; handle errors; return None if the module isn't found.
If the module *is* found but an exception occurs, it's wrapped in an
ErrorDuringImport exception and reraised. Unlike __import__, if a
package path is specified, the module at the end of the path is returned,
not the package at the beginning. If the optional 'forceload' argument
is 1, we reload the module from disk (unless it's a dynamic extension)."""
0 votes
Je dois également être en mesure d'affecter la référence de la classe à une variable.
1 votes
Cela semble être un double de : stackoverflow.com/questions/452969/
0 votes
Vous avez raison, c'est un doublon, merci de l'avoir trouvé.
1 votes
Je n'ai jamais eu besoin de charger une classe comme celle-ci en Python. Vous savez où se trouve le module, alors pourquoi ne pas charger le module et utiliser ses classes comme Python le souhaite, c'est beaucoup plus simple.
31 votes
Si vous n'avez jamais eu besoin de faire cela, c'est que vous n'avez pas encore écrit de programmes suffisamment intéressants. Continuez à vous entraîner.
0 votes
@JohnTyree En quoi le fait de charger dynamiquement des classes signifie-t-il qu'un programme n'est pas intéressant ? Pouvez-vous donner un exemple afin que cette critique puisse être plus utile aux membres de l'OS ?
1 votes
Intéressant "assez". C'est juste une façon ironique de dire que faire des choses bizarres est parfois nécessaire à cause de facteurs que vous ne pouvez pas contrôler et qui sont difficiles à prévoir. Le commentaire précédent disait en gros : "Pourquoi ne pas simplement importer de la façon normale ?" et je dis qu'eux aussi auront un jour un cas de figure bizarre qui nécessitera de faire quelque chose d'affreux.