参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
模块
在Python中,一个.py文件即称为一个模块(module)。为了更好的维护代码,可以按需要把代码或函数分组,分别放到不同的文件里,这样极大地提高了代码的可维护性。另外一方面,当一个模块编写完成,就可以被其他地方引用,这就提升了代码的复用性。
相同名字的函数或变量可以分别存放于不同的模块中,而不必担心名称冲突。而如果不同人编写的模块名称相同该如何处理呢?为了避免这种情况,Python又引入了按目录来组织模块的方法,称为'包’(Package)。
举例,如一个abc.py的文件就是一个名为abc的模块,假设另外有一个模块也叫abc.py,那么则需要通过包来组织模块,避免冲突。比如选择一个顶层包名‘mycompany’,那么此时该包下的abc.py的模块名其实变成了mycompany.abc。
每一个包目录下都会有一个__init__.py的文件,这文件是包所必须的,否则Python就会把这个目录当成普通目录,而非一个包。这个__init__.py可以是空文件,也可以包含代码;这里__init__.py本身也是一个模块,它的模块名就是mycompany(包名)。
#下行注释可以让文件直接在Unix/Linux/Mac上运行 #!/usr/bin/env python3 #下行注释表示该文件本身使用标准UTF-8编码 # -*- coding: utf-8 -*- 'a test module' #该字符串表示模块的文档注释 __author__='Michael Liao' #标注代码作者名 #----------以上是Python模块的标准文件模版 import sys #导入模块sys def test(): #sys模块有个argv变量,以list类型存储了命令行所有参数 #其至少有一个元素,第一个元素永远是该.py文件的名称 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()
模块内部的作用域问题
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_
前缀来实现的。
1、公开的函数和变量名(public)可以被直接引用。
2、类似于__xxx__这样的变量是特殊变量,可以被直接引用,但一般都有特殊用途,如上面的__author__。模块定义的文档注释即上例代码中的第一段字符串也可以用特殊变量__doc__访问。
3、类似于_xxx或__xxx这样的函数或变量一般理解为非公开的(private),不应该被直接引用(注意这里是 不应该,而非不能,因为Python确实没有方法可以完全限制访问private函数或变量),从编程习惯上不应该引用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)
对于上例,在模块中公开了greeting()函数,而把内部其他功能用private函数隐藏起来了,这也是代码封装和抽象的方法,即:对于外部不需要引用的函数或变量全部定义成private,只有外部需要引用的函数才定义为public。