动态导入模块
动态导入模块
什么叫动态导入模块呢?我们平时导入模块都是在程序的头直接 import,例如
import re import json .......
例如这样,直接在文件头导入模块
但问题是,我们有时候导入模块时不是直接在文件的头导入的,而是比如我们拿到的是一个模块的名字的字符串,我们想通过这个字符串导入这个模块,那要怎么办?还可以像上面那样导入吗?显然不可以,上面导入模块时是直接 import ,后面跟的是模块名字但不是字符串(因为字符串是有引号引起来的,上面的没有用引号引起来,所以不算是字符串),所以就要学动态导入模块,通过模块的名字字符串动态导入模块
#test_one 文件的代码 print('this is module test_one') class Test: def __init__(self,name): self.name = name def one(self): print('this is def_one!') def _two(self): //在模块里,如果函数的名字是以“_”开头的,都是约定只在这个模块使用不在别的模块使用,注意,这只是约定,但没有约束 print('this is def_two!')
//__import__()函数
x = __import__('m.test_one') //动态导入模块,通过模块名字的字符串导入 print(x) t = x.test_one.Test('djh')//因为返回的x是最顶层层,也就是m这一层,所以直接 x.test_one.Test() 调用就ok t.one() t._two()//你硬要破坏约定我也没办法 结果 this is module test_one //导入模块就是执行这个模块 <module 'm' from 'C:\\python编程\\m\\__init__.py'> //无论导入的是多少层,得到的都是最顶层,但实际上是已经将这么多层全部导入了,只是返回最顶层而已 this is def_one! this is def_two!
//通过importlib模块来动态导入模块
import importlib x = importlib.import_module('m.test_one') //通过这个模块的import_module()方法,来动态导入模块,返回的是最底层,相当于 from m import test_one print(x) t = x.Test('djh')//因为返回的x是最底层,也就是test_one这一层,所以直接 x.Test() 调用就ok 相当于 t = test_one.Test('djh') t.one() t._two()//你要破坏约定我也没办法 结果 this is module test_one <module 'm.test_one' from 'C:\\python编程\\m\\test_one.py'> //通过这个模块动态导入的话,返回的是最底层 this is def_one! this is def_two!