1.1 模块的概念在Python中,每一个以py结尾的python源文件都是一个模块。 文件名就是模块的名称。文件名同样也是一个标识符,需要符合标识符的命名规则。 模块就好比工具包。模块中定义的全局变量、函数、类 都是提供给外界使用的工具。 在其他位置想要使用模块这个工具包中的工具,就需要先导入这个模块。
1.2 模块的导入方式
导入方式一:import导入 import numpy import numpy, matplotlib #虽然可以一次性导入多个模块,但是不要这么做。
导入之后,就可以通过模块名,使用模块提供的工具(全局变量、函数、类)了。【例1】
如果模块名字太长,可以使用as指定别名。 import numpy as np
例1: # my_模块1.py、my_模块2.py
#test.py
结果:
导入方式二:from ... import 如果希望 从某一个模块中导入部分工具,就可以使用 from ... import 的方式 这样做的好处就是,使用的时候不需要通过模块名.的方式使用工具,而是可以直接使用工具了。【例1】
如果从不同模块导入了相同的函数,那么后导入的模块就会覆盖 先导入的模块。如果就希望两个同名函数都是用,怎么办?可以使用不同的别名。【例2】
例1: # my_模块1.py、my_模块2.py
#test.py
结果:
例2: # my_模块1.py、my_模块2.py
#test.py
结果:
导入方式三:from ... import * 这种方式即可以把模块的所有的工具导入,又可以在使用的使用的时候不加模块名。 听起来很好,但是千万不要用。因为如果多个模块又相同的工具(全局变量、函数、类),又没有文件名,用的时候都不知道用的那个。排错相当麻烦。
1.3 模块的搜索顺序【科普】Python的解释器在导入模块时,是怎么找模块文件的? 首先找当前目录,如果没有再找系统目录。
所以,在开发的时候,编写的模块文件名不要跟 系统的模块文件名重复。比如在当前目录下编写一个叫random.py的文件,那么系统的random模块可能就用不了了。【例1】
可以使用模块的内置属性__file__来查看模块的完整路径。【例1】
例1: (1)正常使用random模块:
结果:
可以看到random被导入了。
(2)在test.py的当前目录下编写random.py的文件。
test.py
执行之后,发现random无法使用:
我们通过random的__file__属性来看一下random模块的路径。
结果: 说明首先看的是当前目录下的random.py文件。
1.4 开发原则——每一个文件都应该是可以被导入的。下面介绍一个开发原则: 我们开发的每一个Python文件都应该是可以被导入的。
我们知道,每一个Python文件就是一个模块。这个模块应该是可以被导入的,这样别人就可以使用了。 但是存在一个问题,就是在导入文件的时候,文件中所有没有任何缩进的代码(可以执行的代码),都会被执行一遍。【例1】 这些可以执行的代码,并不想作为工具提供给别人。但是呢,又不能不写,因为我们开发的函数、类总要测试吧。我们希望:当执行这个模块文件代码时,能执行这些代码;当作为模块给别人使用时,不执行这些代码。
我们可以借助内置属性__name__来解决这个问题。
__name__这个属性,保存的是一个字符串。如果执行当前文件,这个字符串是"__main__";如果这个文件作为模块被执行,这个字符串就是模块名。【例2】 利用这个性质,我们可以在模块文件根据__name__的值进行判断,使得执行模块代码和执行调用模块的代码,运行不同的结果。【例3】
因此为了让测试代码只在测试本模块的时候运行,在导入后不运行,通常把这些代码放到if __name__="__main__"里写。
这样写,即可以测试的时候执行。又能保证导入的时候不执行。
例1: 编写模块:my_模块.py
编写测试文件:test.py,内容什么也不写
执行test.py:
test.py中只是导入了模块,没有做认识事。但是还是输出了两条语句,这是我们不希望的。原因就是,我们在导入模块的时候,会把模块中的代码执行一遍。
例2:
如果执行my_模块.py,结果为:
如果执行test.py,结果为:
例3:
如果执行my_模块文件,因为此时__name__保存的是"__main__",所以会调用fun()
如果执行test.py,因为__name__保存的是模块名:"my_模块",所以为调用fun1()
|