关于模块的背后

来源:2-9 datetime模块之时间转换

iFlowers

2019-04-16 10:40:30

老师,我想问下关于模块背后的一些知识,这些api是怎么在底层实现的?老师能不能给出个引子让我们学习下。

写回答

1回答

时间,

2019-04-16

同学,你好,下边是关于模块导入时和检索时的操作,同学可做一下了解。也可以通过百度查看一些相关的资料进行学习。

关于模块导入时模块底层做的事情:

一、第一次导入模块:底层做了3件事情

        1、在自己的命名空间执行被导入模块中的所有代码;

        2、以模块名为名称创建一个模块对象,并将模块中所有的顶级变量(包括变量和函数)以属性的形式绑定在该模块对象上;

        3、在import位置引入该对象名称到当前命名空间。这里,在当前命名空间使用被导入模块中的属性时要使用“.”语法的原因,就可以解释为要使用一个对象的某个属性,就必须使用“对象.属性”的形式

二、第二次导入模块:直接执行第3步,即在import位置引入该对象名称到当前命名空间。原因是第一次导入之后,已经将前两步执行的结果存储到内存中,第二低导入时直接到相应的内存寻找即可,不需浪费更多内存于此。因此,第二次导入速度更快,且更节省内存

三、import M和from A import B两种导入方式在底层执行机制的异同(重点):两种导入方式第一次导入都会执行上述3步,第二次或更多次导入则只会执行第三步,所以两种导入方式没有谁比谁更节省内存之说,不要认为后者只是导入了模块中的一部分就觉得后者比较省内存,其实际是都会首先执行被导入模块中的所有内容,占的内存是相同的,区别在于是拿被导入模块中的哪些部分到当前命名空间中进行使用

关于被导入模块位置的检索:

一、第一次导入模块:按照模块检索路径顺序去寻找,即第一级是内置模块,如sys模块,这类模块优先级最高;第二级是sys.path路径列表。其中sys.path路径列表路径列表由四部分组成,分别是1.当前目录;2.环境变量PYTHONPATH中指定的路径列表;3.指定路径下的.pth文件中的文件路径列表;4.python的安装路径及其中的LIB库

二、第二次导入模块:直接到加载过的模块群中去找,这里需要使用sys模块中的modules属性来查看哪些模块是被加载过的

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

0

0 学习 · 8160 问题

查看课程