模块的创建
定义模块,只要把一些python代码输入至文本文件,然后以.py为后缀名保存,任何此类文件都会自动被认为是python模块。在模块顶层指定的所有变量名都会变成其属性,并且可以导出供客户端使用。
对于会执行到不会被导入的顶层文件而言,.py从技术上来讲是可有可无的,但是每次都加上去,可以确保文件类型更醒目,并允许以后可以导入任何文件。
模块的使用
import module:
因为import使一个变量名引用整个模块对象,我们必须通过模块名称来得到该模块的属性(如,module.printer)
from module import printer:
因为from会把变量名复制到另一个作用域,所以它就可以让我们直接在脚本中使用复制后的变量名,而不需要通过模块(如,printer)
from module import *:
当我们使用*时,会取得模块顶层所有赋值了的变量名的copy。从根本上来说,这就是把一个模块的命名空间融入另一个模块中。
它有破坏命名空间的潜质,导入变量和本地作用域中变量同名,变量会被悄悄覆盖掉
以from复制的变量名会变成共享对象的引用,修改一个已取出的可变对象,会影响被导入的模块的对象。
模块命名空间:
模块最好理解为变量名的封装。模块技术命名空间(变量名建立所在的场所),而存在于模块之内的变量名就是模块对象的属性。
文件生成命名空间;
模块语句会在首次导入时执行。Python会建立空的模块对象,并逐一执行该模块文件内的语句。
顶层赋值语句会创建模块属性。
模块的命名空间能通过__dict__或dir(M)获取
模块是独立的作用域
Learning Python, Fourth Edition, by Mark Lutz.