美文网首页程序园
一个Java 程序员的python学习之路10- modules

一个Java 程序员的python学习之路10- modules

作者: 赵阳_c149 | 来源:发表于2020-01-08 21:47 被阅读0次

Modules

同大多数其他编程语言一样,python提供了将较大圆吗文件分割为多个较小文件,并在运行时将他们链接起来的机制。

每个较小的文件都可以称作是一个module,在运行时,这些module被定位、编译并最终生成module的对象,这是一个自包含的变量包,构成了namespace

在python中,module是被import链接起来的,之后import通过search path去定位各个module文件。一些C程序员喜欢将python的module import操作和C #include进行比较,但是这并不合适。在python中,import并不是仅仅将文件以文本的形式插入另一文件,而是一个运行时操作,包括三个步骤:

  1. 找到文件
  2. 将其编译成byte code
  3. 运行module的代码以构建其定义的对象

import会从5个目录搜索module文件,按照优先顺序:

  1. 程序的home目录
  2. 环境变量PYTHONPATH所指示的目录
  3. python标准库目录
  4. .pth文件的内容
  5. 第三方库的site-package home目录

可以通过系统变量sys.path查询这些目录。

import找到module文件后,对其进行编译,生成可用的module对象。所有在module的顶层定义的变量都可以被外部调用,也就是会成为module对象attributes

Packages

import不仅可以命名module,还可以命名包含module的目录的路径。一个包含了module的目录就是一个package,也就是说import可以导入package。一个package import将你电脑上的目录转换成了另一种namespace,这样,attributes来自于子目录和包含在目录中的module文件。在python3.x中,import有3种形式:

  1. Basic modules。 importsys.path内的每个路径中查找这些module文件。
  2. 如果一个sys.path内的路径中存放的是一个目录,这个目录中包含一个名为__init__.py的特殊文件,那么这个目录将被当作一个package处理。也就是可以通过import A.B.C的形式引入package,以及package中的module
  3. 在同一个package中,普通的importfrom语句用sys.path的查找规则查找其他package中的module。而“from . import A”的形式,意味着import仅从package内部查找目标module。注意,python2.X的规则稍有不同,普通的(非“from . import A”的形式)import仍然会优先搜索当前的package目录。

namespace package

python3.X中,对package进一步增强,引入了namespace packagenamespace package同一般的package并没有本质的区别,他只是创建package的另一种方式。

  1. namespace package中没有__init__.py文件。
  2. namespace package可以跨多个目录

namespace package的import算法如下:

  1. 如果发现了目录\子目录_init_.py,那么将import进来一个一般的package并返回。
  2. 如果发现了目录\子目录\module.{py,pyc,或者其他类型的module扩展},那么导入一个module,并返回,
  3. 如果发现了目录\子目录,那么将其记录下来并继续扫描查找路径中下一个目录。
  4. 如果1和2都没能返回任何的module或者package,而这时如果第三步中记录了至少一个目录,那么就可以为其创建一个namespace package

结语

Modulepackage的引入,极大的增强了python的功能:

  1. 提高了代码的重用性。
  2. 划分了namespace,减少了变量名的冲突。
  3. 实现了服务或者数据的分享。

相关文章

网友评论

    本文标题:一个Java 程序员的python学习之路10- modules

    本文链接:https://www.haomeiwen.com/subject/cxceactx.html