探究 python import机制、module、package与名字空间

本文深入探讨Python的`import`机制,包括初始化动作、module的使用和名字空间。通过`dir()`函数展示了如何查看名字空间内容,并详细解释了`import`时的搜索路径和内建模块`builtins`。接着讨论了如何import内建及自定义模块,以及`import as`、`from import`和`import *`等用法。最后,阐述了package的使用和名字空间的重要性,强调了Python如何通过名字空间解决模块间的命名冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开始之前,先了解一个内置函数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 的时候会找不到模块,尤其是需要加载位于上层目录的模块的时候要特别注意,这是因为如果不

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值