在开始之前,先了解一个内置函数dir(),它可以帮助我们分析一些内部的东西,dir()的描述是:
dir(): 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
简单来说,不带参数时,会返回当前名字空间的内容(通常是locals名字空间),带参数时,会返回参数的属性:
这里定义了变量a,然后查看 dir() 的内容,可以看到当前的名字空间中包含了一些系统定义的特殊方法还有我们的a。定义一个类,然后查看类的属性,可以看到虽然我们在类中什么都没有定义,但是因为继承了 object 的关系已经有一系列的魔法方法了。OK,我们马上转入到 import 机制中。
初始化的动作:
当我们在命令行敲完 python 回车之后,python已经做了很多很多的初始化工作了。我们可以想象,会有内建类型的初始化,不然我们就没办法使用这些类型来创建实例了;也会有内建函数的初始化,不然连我们的 dir() 都没法用了;还会有搜索路径的初始化,不然 python 怎么会知道你的脚本在哪里呢。总的来说,python的初始化就是设置解释器的状态信息,其中大部分信息是通过创建内置module来完成的,举个例子,我们看看刚才 dir() 里的__builtins__:
这不就是一个叫做‘builtins’的内建 module 吗,我们平常用的 import 就是用来加载模块的,只是我们不会刻意的区分内建模块和自定义模块罢了。当然了,一个模块也会有它的属性,我们 dir 看看:
哦,原来 python 把类型和内建函数初始化之后就放在这个 builtins 模块中,这里我们就可以找到我们熟悉的类型,还有各种各样的异常类型,还有内建函数等等。哎刚刚不是说还会初始化路径吗,在 locals 名字空间里也没有看到类似__path__的东西呀,原来,不是所有的初始化的动作都会暴露在名字空间中的,这样可以让名字空间更加干净,隐藏一些不需要用户知道的东西。我们来找找看,或许大家都知道了,python 的默认搜索路径可以在 sys 内建模块中找到:
这里先讲一讲为什么需要这个路径,这个路径就是我们在安装 python 的时候,需要我们去设置的环境变量。我们可以看到有site-packages文件夹的路径,这是放第三方库的地方,用 setup install 的话会把库复制到这里,比方说numpy就在里面,import numpy就是从这个路径中搜索出来的,还有dlls文件夹的路径,通常加载的pyd就在里面,还有lib等等,执行 import 语句的时候,python 会从默认路径中搜索,当然也会在脚本所在的路径搜索,如果在这些路径中都找不到要 import 的模块就会报错。0.0现在知道 import 失败为什么要去看看环境变量有没有错了吧。
*这段可以跳过。实际上搜索路径是一个限制,有时候使用相对路径 import 的时候会找不到模块,尤其是需要加载位于上层目录的模块的时候要特别注意,这是因为如果不