廖雪峰的网站https://www.liaoxuefeng.com/wiki/1016959663602400/1017454145014176
模块
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,一个.py文件就称之为一个模块(Module)
- 提高了代码的可维护性
- 还可以避免函数名和变量名冲突
不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)
mycompany
├─ init.py
├─ abc.py
└─ xyz.py
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突,abc.py
模块的名字就变成了mycompany.abc
,类似的,xyz.py
的模块名变成了mycompany.xyz
每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块,而它的模块名就是mycompany
。
可以有多级目录,组成多级层次的包结构
使用模块
'a test module'#表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释
__anthor__='michael liao'#使用__author__变量把作者写进去
import sys#导入sys模块后,我们就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能
def test():
args=sys.argv#sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,第一个参数永远是该.py文件的名称
#运行python3 hello.py获得的sys.argv就是['hello.py']
#运行python3 hello.py Michael获得的sys.argv就是['hello.py', 'Michael']
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()
#当在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__
#而如果在其他地方导入该hello模块时,if判断将失败
#因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试
$ python3 hello.py
Hello, world!
$ python hello.py Michael
Hello, Michael!
#即导入时,没有打印Hello, word!,因为没有执行test()函数。
#调用hello.test()时,才能打印出Hello, word!
>>> import hello
>>> hello.test()
Hello, world!
作用域
正常的函数和变量名是公开的(public),可以被直接引用,比如:abc
,x123
类似__xxx__
这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如__author__
类似_xxx
和__xxx
这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc
,__abc
“不应该”被直接引用,而不是“不能”,python并没有一种方法可以完全限制访问private函数或变量。