从字符串获取python类对象

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',
)

现在我需要对每个类调用authenticate()函数(当然,除非注释掉)。我很高兴地在列表中迭代,我只需要知道如何在foreach循环中将字符串转换为类对象,这样我就可以对它调用authenticate方法。有简单的方法吗?


您希望使用importlib模块来处理这样的模块加载,然后简单地使用getattr()来获取类。

例如,假设我有一个模块,somemodule.py,其中包含类Test

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;