Get python class object from string
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Dynamic module import in Python
可能是个简单的问题!我需要遍历从设置文件传递的类(作为字符串)列表。课程如下:
1 2 3 4 5 6 7 8 | TWO_FACTOR_BACKENDS = ( 'id.backends.AllowToBeDisabled', # Disable this to enforce Two Factor Authentication 'id.backends.TOTPBackend', 'id.backends.HOTPBackend', #'id.backends.YubikeyBackend', #'id.backends.OneTimePadBackend', #'id.backends.EmailBackend', ) |
现在我需要对每个类调用
您希望使用
例如,假设我有一个模块,
1 2 3 4 5 6 7 8 | import importlib cls ="somemodule.Test" module_name, class_name = cls.split(".") somemodule = importlib.import_module(module_name) print(getattr(somemodule, class_name)) |
给我:
1 | <class 'somemodule.Test'> |
添加软件包之类的东西很简单:
1 2 3 4 | cls ="test.somemodule.Test" module_name, class_name = cls.rsplit(".", 1) somemodule = importlib.import_module(module_name) |
如果模块/包已经导入,它将不会导入,因此您可以在不跟踪加载模块的情况下愉快地执行此操作:
1 2 3 4 5 6 7 8 9 10 11 12 | import importlib TWO_FACTOR_BACKENDS = ( 'id.backends.AllowToBeDisabled', # Disable this to enforce Two Factor Authentication 'id.backends.TOTPBackend', 'id.backends.HOTPBackend', #'id.backends.YubikeyBackend', #'id.backends.OneTimePadBackend', #'id.backends.EmailBackend', ) backends = [getattr(importlib.import_module(mod), cls) for (mod, cls) in (backend.rsplit(".", 1) for backend in TWO_FACTOR_BACKENDS)] |
nbsp;