python笔记-模块
世人都说不要重复造轮子,但学习阶段,自己造些轮子,还是很有用的.
模块是一组Python代码的集合,可以使用其他模块,也可以被其他模块使用。
创建自己的模块时,要注意:
- 模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
- 模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行
import abc
,若成功则说明系统存在此模块。- 另外注意函数名不要和内置函数重名
包(package)
为了避免模块名冲突,python引入了按目录来组织模块的方法,称为包(package)
一个abc.py
文件就是一个名叫abc
的模块,一个xyz.py
文件就是一个名字叫xyz
的模块,假设这两个模块于其他模块冲突了,此时可以通过包
来避免,只要加一个顶层包名,比如mycompany
,按照如下目录存放:
1 |
|
其中每一个包目录下面都要有一个__init__.py
文件,这个文件是必须的
,里面可以是空文件,也可以有代码,因为__init__.py
本身就是一个模块,它的模块名就是mycompany
另外可以有多级目录,组成多层次的包结构,每一层都要有__init__.py
1 |
|
文件www.py
的模块名就是mycompany.web.www
,两个文件utils.py
的模块名分别是mycompany.utils
和mycompany.web.utils
。
使用模块
使用
1 |
|
安装
pip
一般来说第三方库都会在官方的pypi.python.org注册,通过pip命令即刻安装1
pip install requests
Anaconda
Anaconda会把系统Path中的python指向自己自带的Python,并且,Anaconda安装的第三方模块会安装在Anaconda自己的路径下,不影响系统已安装的Python目录.
另外,用Anaconda管理虚拟环境也是很好的选择.
模块搜索路径
默认下,python会搜索当前目录
,所有已安装的内置模块
和第三方模块
,搜索路径存放在sys
模块的path
变量中
1 |
|
修改搜索路径,添加自己的目录有两种方法:
在代码中修改
sys.path
,这种方法只会在代码运行时有效
1
2import sys
sys.path.append('/Users/michael/my_py_scripts')修改环境变量
PYTHONPATH
,该变量的内容会添加
到原有的搜索路径中,原来的搜索路径不受影响.
模块编写
以hello
模块为例,展示标准的模块模板
:
hello.py
1 |
|
- 第一行是标准注释,表明使用哪个python运行时
- 第二行也是标准注释,表明.py文件本身使用标准的UTF-8编码
- 第四行是一个字符串,任何模块代码的
第一个字符串
都被视为模块的文档注释
__author__
变量表示模块作者- 后面才是你的代码
注意这两行代码:
1 |
|
当我们在命令行运行hello
模块文件时,python解释器会把一个特殊的变量__name__
赋值为__main__
,
而如果在其他地方导入该模块,if
判断会失效,
所以这种if
可以让一个模块通过命令行运行
时执行一些额外的代码
.用作运行测试
.
1 |
|
作用域
__xxx__
是特殊变量,可以被直接引用,是public
的,比如__author__
,__name__
等,模块定义的文档注释也可以用__doc__
访问,我们自己代码一般不要用这种变量名
- 正常的函数名和变量是公开的
public
,可以被直接引用 - 非公开的
private
函数名和变量以_
前缀来表示,比如_xxx
和__xxx
.他们都不应该
被直接引用- python并没有一种方法可以完全限制private函数或变量的访问,但是从编程习惯上我们
不应该
应用private函数或变量
- python并没有一种方法可以完全限制private函数或变量的访问,但是从编程习惯上我们
1 |
|
例如上面的代码,只公开了greeting
函数,内部逻辑都用private
函数隐藏起来.这样在调用greeting()
时就不需要关心内部的provate函数细节,这是一种非常有用的代码封装和抽象的方法
.