任何py文件都可以做module。扩展C的时候,动态库也可以作为module导入。

module里面可以定义函数 类 变量。(其实没有区别,对python来说,所有的东西都是对象)
如果定义一个函数,在函数定义第一行出现的字符串文本会当作函数的docstring变量,其实就是该函数的注释,在python命令交互环境下可以调用function.__doc__(2个下划线)来显示该变量。

导入的语法为 import ,如果只导入 部分成员,可以用 from module1 import (attr1,attr2)

也可以from module1 import(*),导入所有的成员,但是不推荐这么做,容易引起名字冲突。但是不会报错,只会产生很难发现的运行问题。

module的import原理:import一个模块会先在sys.modules这个字典中找是否有该模块的名字,如果有,那么就返回该模块,如果没有就在sys.modules中添加该模块的名字,然后执行该模块。
该工作方式保证每个模块只执行一次,同时也导致了一个问题,如果导入同名的两个不同模块,只有先被导入的模块会成功导入,后一个模块不会被导入。
还有一个问题注意,如果模块存在互相导入的关系,可能会引发错误。例如模块a 和模块b,a中间有import b,b里面又有import a。如果先导入a,那么当a执行到import b的时候,会进入到模块b的代码;当b执行到import a的时候,会发现sys.modules里面已经有a,就会返回a的一个绑定;但是要记得,a这个时候才执行到import b这段,所以它后面的定义都没有完成,如果这个时候b有定义访问了这些没有定义的成员,会引发异常。
这么设计的一个好处是,互相引用不会向c++头文件互相引用那样产生递归,不需要写#ifdefine这些预编译指令。

python还有一些内建模块,在__builins__字典中记录,可以直接调用__builtins__打印所有的内建模块。