thtl

导航

动态导入模块

动态导入模块

什么叫动态导入模块呢?我们平时导入模块都是在程序的头直接 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!

 

posted on 2018-09-07 15:57  thtl  阅读(53)  评论(0编辑  收藏  举报