-
模块
简单地说,每一个扩展名以.py结尾的python源代码文件都是一个模块。
其他的文件可以通过导入一个模块来读取这份模块定义的内容。本质上就是载入另一个文件并获得读取那个文件内容的权限。
一个模块的内容通过属性被外界使用。
-
模块的导入
import modname
一个大的程序往往是由很多小的模块组成。其中有一个启动后能够运行整个程序的文件,这个文件就是该程序的主文件,也叫做顶层文件或“脚本”。它是照常逐行运行的,在这一层之下全部是模块导入模块。
由于导入操作运行文件中的代码,这个文件作为最后一步正在被加载,所以导入文件也是一种运行文件的方法。
例如:
我们可以先编写一个简单的python源文件并命名为a.py
#a.py
a=3
b=5
x=a+b
print(x)
然后在命令行用import运行它
但是在默认的情况下每次会话只运行一次,在第一次倒入后其他的导入都不会再工作,甚至在另一个窗口中改变保存了模块的源代码文件也不行
第三行是再次运行a.py
第四行是改变a的值后保存并重新运行
但是可以发现无法运行
这并不是程序员的忽略,而是有意设计的。因为导入是一个开销很大的工作,导入必须找到文件,将其编译成字节码,并运行代码。所以每个文件,每个程序都不能重复运行多于一次。所以如果想要在python中在一次会话中再次运行文件而不停止和重新启动会话就需要用到重载了。
-
重载
调用imp标准库中的reload函数(这里是基于python3的,python2中reload是一个简单的内置函数)
from语句直接从一个模块中复制出一个名字,reload函数自身载入并运行了文件当前版本的代码,由于我们修改过源文件它会将修改的变化反映出来。这允许你在当前的交互会话中立即编辑并改进代码。
reload函数的参数是一个已被加载了模块的对象名称,所以在重载之前请确保已将成功导入了这个模块。
如果导入报告了一个错误,你就不能重新加载,而必须再次导入
例如:这里在导入时出现了两个错误,我们必须修改后再次导入,而不是修改后直接重载
像这样,修改正确后重新导入,然后再重载
- reload函数的对象在括号里,而import不需要括号。因为reload是一个被调用的函数,而import是一个语句
-
模块的宏观视角——属性
模块就是变量名的包,即命名空间,包中的变量名称为属性。简单地说属性就是绑定在特定对象上的变量名。
一个模块的变量名可以通过两种python语句读取——import和from、以及reload的调用
首先再建立一个python源文件,里面只需要一个赋值语句。
例如:
#s.py
s="这是朕的江山"
用import导入并获取它的属性
当文件导入时他的代码运行并生成了模块的属性,然后使用对象(文件)名点属性名的方式获取它
一般的,object.attribute可以让你从任何对象中取出其任意属性。
使用from语句从模块文件中获取(实际上是复制出)变量名
from和import很相似,只是from增加了对载入组件中变量名的额外的赋值。也就是from复制了模块的属性,使属性能够直接接收变量而不用属性引用(对象.属性)
-
模块和命名空间
python程序往往由多个模块文件构成,通过import语句连接在一起。每个模块文件是一个变量包(命名空间)。
每个模块都是自包含的命名空间:一个模块文件不能看到其他文件中定义的变量名,除非它显式地导入了该文件。
每个文件都是一个独立完备的命名空间,即使在它们拼写相同的情况下一个文件的变量名也不会和另一个文件中的变量名冲突。