写在前面
动态导入主要应用于临时导入一个模块。好久不用,忘得一干二净,写个帖子记录下。
工程结构:
我想在main_module.py中使用packet1的dog模块的类/方法/变量
test:
main_module.py
packet1
__init__.py
dog.py
packet2
__init__.py
dog.py
1- 写死模块名字动态导入
main_module.py
import_pack_name = importlib.import_module(包名字),返回的是包下面__init__.py中需要导入的类/方法/变量信息,之后就可以使用import_pack_name.类/方法/变量.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import importlib
pkg_name = "pack1"
class_name = "Dog"
import_pack_name = importlib.import_module(pkg_name)
dog = import_pack_name.Dog()
dog.dog_print()
import_pack_name.pack_dog()
import_pack_name.dog_val
packet1.__init__.py(重要)
填写需要导出的模块、类、方法、变量
from pack1.dog import Dog
from pack1.dog import pack_dog
from pack1.dog import dog_val
packet1.dog.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Dog():
def __init__(self):
print("pack1.dog: __init__")
def dog_print(self):
print("pack1.dog: dog_print")
def pack_dog():
print("pack1.dog: pack_dog()")
dog_val = "pack1.dog: dog_val"
2- 使用getter从获取需要导出的类、函数、变量
main_module.py
使用getattr获取对象的属性。这里我们填入包导出的信息对象和类/方法/变量名字,即可返回类/方法/变量的对象。
注意:对于返回的类对象,需要先实例化再使用。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import importlib
pkg_name = "pack1"
class_name = "Dog"
func_name = "pack_dog"
val_name = "dog_val"
import_pack_name = importlib.import_module(pkg_name)
import_class = getattr(import_pack_name, class_name)
import_func = getattr(import_pack_name, func_name)
import_val = getattr(import_pack_name, val_name)
dog = import_class()
dog.dog_print()
import_func()
print(import_val)
packet1.__init__.py、packet1.dog.py 同前。