AI摘要:本文介绍了Python中模块和包的基本概念。模块是一个.py文件,使用模块可以提高代码的可维护性和重用性。包是按目录组织模块,避免模块名冲突。每个包目录下都必须有一个`__init__.py`文件,它可以是空文件或包含Python代码。模块和包的命名要遵循规范,不要与系统模块名冲突。文章还介绍了如何使用模块和包,以及模块的作用域和模块搜索路径。
一、模块的基本概念
模块:在Python中,一个.py文件就称之为一个模块(Module)
使用模块的好处:(1)提高了代码的可维护性。(2)编写代码不必从零开始。(3)使用模块还可以避免函数名和变量名冲突。
注意:尽量不要与Python的内建函数冲突。Python内建函数介绍:https://docs.python.org/3/library/functions.html
二、包的基本概念
为了避免模块名冲突,引入按目录组织模块,避免冲突。方法是选择一个顶层的包名,比如mycompany,按照如下目录存放:
mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py
引入包名后,只要顶层的包名不与别人冲突,那么所有模块都不会与别人冲突。abc.py
模块的名称就变为了mycompany.abc
,xyz.py
的模块名就变为了mycompany.xyz
。
每一个包名目录下都会有一个__init__.py
文件,这个文件必须存在,否则Python就会把这个目录当做普通目录,而不是一个包。
__init__.py
文件可以是空文件,也可以有Python代码。它本身就是一个模块,而它的模块名就是mycompany
类似的,可以有多级目录,组成多层级的包结构。
mycompany
├─ web
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ abc.py
└─ utils.py
文件www.py
的模块名就是mycompany.web.www
,两个文件utils.py
的模块名分别是mycompany.utils
和mycompany.web.utils
。
总结:模块是一组Python代码的集合,可以使用其他模块,也可以被其他模块使用。在此模块。
创建自己的模块时,要注意:
模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块。
三、使用模块
以内建的sys
为例,写一个hello的模块。
#!/user/bin/env python3 #第一行注释让hello.py文件可以直接在Unix/Linux/Mac上运行
# -*- coding: utf-8 -*- #第二行注释表示.py文件本身使用UTF-8编码
'a test module' # 字符串,表示模块的文档注释。任何模块代码的第一个字符串都被视为模块的文档注释
__author__ = 'Bruce Wang' # __author__变量把作者写进去
#以上是一个Python模块的标准文件模板,也可以全部删掉不写。
# 后面是真正的代码
import sys
def test():
args = sys.argv
if len(args) == 1:
print("Hello, world!")
elif len(args) == 2:
print("Hello, %s!" % args[1])
else:
print("Too many arguments!")
if __name__ == '__main__':
test()
Too many arguments!
四、作用域
类似__xxx__这样的变量(__author__
,__name__
)是特殊变量,可以被直接引用但是有特殊用途,我们自己的变量一般不要用这种变量名;
类似_xxx和__xxx这样的函数或变量是非公开的(private),不应该被直接引用。
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
print(greeting("Bruce"))
Hello, Bruce
我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:
外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
五、模块搜索路径
加载一个模块时,Python会在指定的路径下搜索对应的.py文件,默认情况下Python解释器会搜索(1)当前目录;(2)所有已安装的内置模块(3)第三方模块。搜索路径存放在sys模块的path变量中:
import sys
sys.path
['D:\\pythonProject\\05 模块',
'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\python310.zip',
'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\DLLs',
'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib',
'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310',
'',
'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages',
'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\win32',
'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\win32\\lib',
'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\Pythonwin']
评论 (0)