Python动态加载模块、类、函数的几种方式

1. exec()

使用exec来执行Python导入模块的命令。

1
2
3
module_name = "module01"
exec("import " + module_name)
module01.echo()

2. __import__()

单独使用__import__() 可以直接加载模块,但是当需要动态加载类、函数时,就需要配合getattr来实现。

实现步骤:

  1. 获取模块名(module_name)
  2. 使用__import__(module_name)导入Python模块
  3. 使用getattr(module_name, class_name/function_name)获取类、方法的对象 例子:

模块(module01.py)中包含一个Index类和一个echo方法。主程序(main.py)使用模块名动态调用其echo方法。

module01.py:

1
2
3
4
class Index:
def echo(self, content):
print(self)
print(content)

main.py:

1
2
3
4
5
6
7
8
module_name = "module01"
class_name = "Index"
function_name = "echo"

module_object = __import__(module_name) #将模块加载为对象
module_class = getattr(module_object, class_name) #获取模块当中的类对象
module_class_object = module_class() #将类实例化
module_class_object.echo("Hello World") #调用echo方法

此外,还可以这样调用类中的函数:

main.py:

1
2
3
4
5
6
7
8
9
10
module_name = "module01"
class_name = "Index"
function_name = "echo"

module_object = __import__(module_name) #将模块加载为对象
module_class = getattr(module_object, class_name) #获取模块当中的类对象
module_function = getattr(module_class, function_name) #获取类中方法对象
module_function("Hello World")
# 或者直接 module_class.echo()
# 需要注意的是,使用这种方式调用方法,方法的参数值不需要加self。

参考:

python 动态调用模块&类&方法

3. importlib

这种方式其实是__import__() 方式的扩展。Python官方文档推荐程序式地导入模块时应该使用 import_module() 而不是__import__

实现动态加载的方式与第二种类似:

module01.py

1
2
3
4
class Index:
def echo(self, content):
print(self)
print(content)

main.py

1
2
3
4
5
6
7
8
import importlib

module_name = "module01"
class_name = "Index"

module_object = importlib.import_module(module_name) #将模块加载为对象
module_class_object = module_object.Index() #将类实例化
module_class_object.echo("Hello World") #调用echo方法

(同样的这里可以配合getattr()使用)

使用importlib的一个好处就是还可以使用reload方法。在模块已经被导入的情况下,使用importlib.reload导入新的模块。

详情可见:importlib — import 的实现

0%