Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Import class from module dynamically

I have class called 'my_class' placed in 'my_module'. And I need to import this class. I tried to do it like this:

import importlib result = importlib.import_module('my_module.my_class') 

but it says:

ImportError: No module named 'my_module.my_class'; 'my_module' is not a package 

So. As I can see it works only for modules, but can't handle classes. How can I import a class from a module?

like image 921
GhostKU Avatar asked Jan 16 '17 13:01

GhostKU


People also ask

Can I dynamically load a module in Python?

The globals() call returns a dict. We can set the lib key for each library as the object returned to us on import of a module.

What is __ import __ in Python?

__import__() Parameters name - the name of the module you want to import. globals and locals - determines how to interpret name. fromlist - objects or submodules that should be imported by name. level - specifies whether to use absolute or relative imports.


2 Answers

It is expecting my_module to be a package containing a module named 'my_class'. If you need to import a class, or an attribute in general, dynamically, just use getattr after you import the module:

cls = getattr(import_module('my_module'), 'my_class') 

Also, yes, it does only work with modules. Remember importlib.import_module is a wrapper of the internal importlib.__import__ function. It doesn't offer the same amount of functionality as the full import statement which, coupled with from, performs an attribute look-up on the imported module.

like image 73
Dimitris Fasarakis Hilliard Avatar answered Sep 21 '22 06:09

Dimitris Fasarakis Hilliard


import importlib import logging  logger = logging.getLogger(__name__)   def factory(module_class_string, super_cls: type = None, **kwargs):     """     :param module_class_string: full name of the class to create an object of     :param super_cls: expected super class for validity, None if bypass     :param kwargs: parameters to pass     :return:     """     module_name, class_name = module_class_string.rsplit(".", 1)     module = importlib.import_module(module_name)     assert hasattr(module, class_name), "class {} is not in {}".format(class_name, module_name)     logger.debug('reading class {} from module {}'.format(class_name, module_name))     cls = getattr(module, class_name)     if super_cls is not None:         assert issubclass(cls, super_cls), "class {} should inherit from {}".format(class_name, super_cls.__name__)     logger.debug('initialising {} with params {}'.format(class_name, kwargs))     obj = cls(**kwargs)     return obj 
like image 41
Hanan Shteingart Avatar answered Sep 20 '22 06:09

Hanan Shteingart