目录
模块
模块的基本介绍
包
编写模块
作用域
内置模块
第三方模块
模块搜索路径
[TOC]
模块
模块的基本介绍
Module,即模块、组件的意思。在Python中,一个.py文件即是一个模块。在编写程序时,可以引用其他模块,在编写完成后又可以作为模块被其他程序引用。相同的函数名与变量名可以存在不同的模块中而不产生冲突。
使用模块的好处:提高代码的可维护性,编写程序可引用其他模块而更为方便。
包
为了避免模块名字与另外的模块名字产生冲突,可以通过用包来组织模块。如下
mywork├─ \__init__.py├─ aaa.py└─ ccc.py
mywork是一个包名,在其目录下必须存在_init.py这一文件,否则则视为普通的目录而非一个包。事实上,_init.py也是一个模块,它的模块名就是mywork。
当一个模块被包组织起来,它的模块名就会发生变化,如aaa.py的模块名变成了mywork.aaa,ccc.py的模块名变成了mywork.ccc。
包还能有多级目录,如
mywork ├─ work │ ├─ __init__.py │ ├─ aaa.py │ └─ one.py ├─ __init__.py ├─ aaa.py └─ ccc.py
此时,在work里面的aaa.py的模块名为mywork.work.aaa,在mywork里面的aaa.py的模块名为mywork.aaa。
编写模块
先给出一个简单的模块编写代码
#! /user/bin/env python3# -*- coding utf-0 -*-' a text module'__author__ = 'San bei'import sysdef add(x, y): return x + y
第1、2行是标准注释,第1行的注释#!/user/bin/env python3使得这个模块可以直接在Unix/Linux/Mac上运行,第2行注释# -- coding:utf-8 --表示文件使用标准的utf-8编码。
第4行是模块的文档注释,任何模块代码的第一个字符串都被当作是模块的文档注释。
第6行使用模块的_author_变量写入模块的作者。
以上就是Python模块的标准文件模板,可以不写,但还是建议按照标准格式构建模块。
接下来是模块的真正代码部分。
将它保存为text.py,在命令行模式直接运行模块,结果如下:
>>>text.py3
这个模块还能被引用,在交互式模式下引用模块,结果如下:
>>>import text3>>>text.add(5, 2)7
会发现在用import引入模块后,会执行被引用的模块,输出我们不需要的结果3。要解决这个问题,要在模块编写的时候加上if _name_ == '_main_',像这样:
#! /user/bin/env python3# -*- coding utf-0 -*-' a text module'__author__ = 'San bei'import sysdef add(x, y): return x + yif __name__ == '__main__': print(add(1, 2))
这是是什么意思呢?我们知道.py文件就是一个模块,可以直接运行,那么当模块直接运行的时候,模块的_name属性会变为_main。而当模块被引用时,模块的_name属性还是_name。
所以,这一行代码的意思是当模块直接运行时,就会执行下面的代码,当模块被引用时则不会执行下面的代码。
一般而言,在编写模块时都会加上这一语句,因为在引用模块时,只需要模块内的函数,而不需要该模块本身输出的结果。
这时候引用模块就不会输出3了:
>>>import text>>>text.add(5, 3)8
作用域
在定义变量名时,会有这样约定俗成的编程习惯。
正常的函数或变量名是公开的,像abc,xxy,PI,称为public变量,可以被直接引用
类似_xxx这样的变量是一些特殊变量,如上面提到的_name,我们不会用这样的方式来定义变量
类似_xxx这样的变量是非公开的,称为private变量,不应该被直接引用。
可以通过一个公开的函数把非公开的函数隐藏起来,这样内部的逻辑就不会公开,如(下面例子转自廖雪峰的官方网站)
def _private_1(name): return 'Hello, %s' % namedef _private_2(name): return 'Hi, %s' % namedef greeting(name): if len(name) > 3: return _private_1(name) else: return _private_2(name)
内置模块
在编写程序时,我们可以引用Python内置的模块来简化程序的编写过程。需要注意的是,在我们自己编写模块时,模块名不要与内置模块名相同,也不要与内置函数名相同,否则会发生冲突。Python所有内置的函数
比如我们编写了一个sys.py的模块,这样系统内置的sys模块将不能被导入。
第三方模块
除了引用Python系统的内置模块之外,我们还能引用第三方模块,一般来说,第三方库都会在Python官方的网站注册。
在安装了包管理工具pip之后,就可以通过pip来安装第三方模块了。
pip install Pillow
在命令行模式下输入pip install Pillow,便会安装第三方模块Pillow。
模块搜索路径
但我们加载一个模块时,Python会在指定目录下搜索这一.py文件,如果搜索不到则报错。
默认情况下,Python会先搜索当前目录。Python的搜索路径存放在sys模块的path变量中。
如果找不到模块,我们可以手动添加自己需要的搜索目录,有三种方法。
• 动态添加目录
>>> import sys>>> sys.path.append('C:\\Users\michael\my_py_scripts')
临时生效,对于不经常使用的模块,这通常是最好的方式。
• 设置 PYTHONPATH 环境变量
如果是win7系统的话,可以通过右键计算机--->属性--->高级系统设置--->环境变量进行设置。
该环境变量的内容会被自动添加到模块搜索路径中,Python本身的搜索路径不会受到影响。
• 增加 .pth 文件
在Python目录下的lib\site-packages里面增加.pth文件,内容为需要添加的路径即可。
作者:三贝_
链接:https://www.jianshu.com/p/07a3111dade8