Python公开课 - 详解模块

前言

模块是一个包含所有你定义的函数和变量的文件,可以被别的程序引入,以使用该模块中的函数等功能。

现在流行的模块化设计也是这个概念,一个项目经过模块化设计后,模块接口需要做标准化处理,这样可以方便在其他项目中进行复用,提高开发效率。

制作一个模块

我们可以编辑一个module.py文件

def my_print(info):
    print("module: %s" %info)

保存后,我们就可以在其他的文件中引用并使用其中的函数功能了

>>>import module
>>>module.my_print('hello world')

输出:
module: hello world

一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。

模块的路径

当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?

这就涉及到Python的搜索路径,搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。

>>> import sys
>>> sys.path
['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']

我们可以通过sys.path.append()来添加指定的目录

包 - Package

在大多数情况,会选择以目录的方式来整理模块文件,例如创建一个test目录,并将module.py移动到该目录下,如果这时候直接使用my_print函数就会发现失败了,原因是找不到该目录

from test import module

module.my_print("hello world")


输出:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    from test import module
  File "/home/ubuntu/learn/test.py", line 1, in <module>
    from test import module
ImportError: cannot import name 'module'

这时候就算我们通过sys.path.append('test')也不行,

那么该怎么办呢,这时候需要在test目录下创建一个__init__.py文件就可以了

__init__.py的作用

含有__init__.py文件的目录会被Python解释器作为Package来对待。

我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。

相关阅读