1. 主页
  2. Python基础到高级
  3. 模块化

模块化

导入模块

导入模块非常简单,使用Python关键字来导入Python即可,没啥太多好解释的

import os    # 全部导入
from os import getcwd   # 部分导入
import os as os_l   # 创建导入别名
from os import getcwd as pwd  

自定义模块

在Python中,Python文件即模块,模块名为文件名

因为文件名是模块名,因此要求文件名必须符合Python标识符的规范,否则无法导入

另外需要注意的是,如果你导入的是Python的标准库,那么你就不要在当前文件的目录下创建和标准库相同的名字,否则会出现导入错误模块的情况,每次导入模块Python都是去sys.path中去找模块文件的

In [2]: sys.path
Out[2]: 
['',
 '/root/.pyenv/versions/3.6.1/envs/lanyulei/bin',
 '/root/.pyenv/versions/3.6.1/lib/python36.zip',
 '/root/.pyenv/versions/3.6.1/lib/python3.6',
 '/root/.pyenv/versions/3.6.1/lib/python3.6/lib-dynload',
 '/root/.pyenv/versions/3.6.1/envs/lanyulei/lib/python3.6/site-packages',
 '/root/.pyenv/versions/3.6.1/envs/lanyulei/lib/python3.6/site-packages/IPython/extensions',
 '/root/.ipython']    

当导入的文件不存在的时候就会抛出模块不存在的错误

In [3]: import sdf
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-3-0c4351672b24> in <module>()
----> 1 import sdf

ModuleNotFoundError: No module named 'sdf'    

Python标识符的规范,字母,数字,下划线组成,不能以数字开头,通常模块名都是定义为小写,如果有多个单词的话,下划线为分割符

Python中导入的本质就是执行,导入模块的时候,就相当于执行模块了

因为Python导入的缓存机制,所以不论导入几次,仅执行一次

既然导入即执行,那么我们就慎重的导入模块,不要导入不受信任的模块,避免造成不必要的损失

__name__属性,当模块被import的时候__name__是模块名称,当执行执行Python文件的时候__name__是 __main__,当我们需要执行测试代码的时候,可以放到这里

目录作为模块

在Python种目录同样也是可以作为一个模块的

如果目录作为一个模块的话,就需要有一个__init__.py的文件,也可以叫做入口文件,因为如果没有这个文件的话,目录将无法称之为一个完整的模块,在旧版本的Python中,没有中文件是无法导入子模块的,但是在新版的Python中已经去掉了这个限制

当一个模块的规模较大的时候,用目录的形式,可以更好的组织代码

目录作为目录的特点

  • 单独导入目录模块的话,不会自动导入子模块
  • 部分导入子模块的话,会自动导入父模块,即目录模块

目录的可见性

在Python的模块引用是,模块的成员是不存在私有这一说法的,但是按照惯例,模块以下划线开始,但是非双下划线开始的,双下划线结尾的成员,认为是私有的

模块变量可以被修改,并且在修改之后,引入此模块,变量是修改后的,修改后的变量会影响到所有引入此模块的模块,所以修改是一件非常危险的事情

通常情况下,要绝对禁止修改模块变量

setup.py

当我们需要将我们的模块或者程序打包的时候,只需创建一个setup.py的文件即可

下面的几行代码仅为测试,具体的根据实际情况去修改,认真学习setup方法即可

参考文档:https://docs.python.org/3.5/distutils/setupscript.html

from distutils.core import setup

setup(name='test', version='0.0.1', packages=['m', 'm.foo'])    

我们要如何帮助您?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注