模块
模块的几种导入方法
每一个以扩展名py
结尾的源代码文件都是一个模块。
模块名同样也是一个标识符,需要符合标识符的命名规则。
在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具
模块就像是一个工具包,想要使用其中的工具,需要先导入这个模块。
import导入
import 模块名1
import 模块名2
导入之后,通过模块名.
使用模块提供的工具。
可以在导入时使用as
给模块起别名,模块别名应该符合大驼峰命名法。
import 模块名 as 模块别名
导入部分工具
import
是一次性把模块中所有工具全部导入,并通过模块名或者别名访问,而导入部分工具可以使用from...import
的方式,导入之后不需要通过模块名.
的方式调用,而是可以直接使用。
form 模块名 import 工具名
如果两个模块存在同名的函数,那么后倒入模块的函数会覆盖先导入的函数。这个时候可以通过给另一个工具起一个工具别名来解决。
不推荐的导入方法:
from 模块名 import *
一次性导入所有工具,并且不需要模块名.
调用,但是不方便排查错误。
导入模块的搜索顺序:
python的解释器导入模块时,会搜索当前指定模块名文件,如果有就直接导入,如果没有就会搜索系统目录。
在开发时,如果给文件起的名字不小心和系统模块文件名重名,那么python就会直接调用该模块而不是系统模块,就会可能会导致不想要的结果。
import random
rand = random.randint(0, 10)
print(rand)
这时候,如果当前目录文件夹下面存在一个random.py
文件,程序就无法正常运行。
使用内置属性__file__
可以查看模块的完整路径。在pycharm中没有用,但是在ipython中可以。
print(模块名.__file__)
测试模块
在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍,但是一般在导入模块时,能够直接执行的文件一般都不需要立即执行。
在实际开发中,每个模块都是独立开发的,所以通常会在模块下方增加一些测试代码,仅在模块内使用,而被导入到其他文件中不需要执行。
__name__
属性可以做到,测试模块的代码只有在测试情况下被运行,而在被导入时不会被执行。
__name__
是python的一个内置属性,记录着一个字符串,如果是被其他文件导入的,__name__
就是模块名,如果是当前执行的程序,__name__
就是__main__
创建一个test_han.py
的模块如下:
print("小明开发的模块")
print(__name__)
def say_hello():
print("HELLO")
say_hello()
运行结果:
小明开发的模块
__main__
HELLO
在另一个模块中导入test_han模块:
import test_han
print(__name__)
print("小韩开发的模块")
运行结果:
小明开发的模块
test_han
HELLO
__main__
小韩开发的模块
如果在test_han中增加一个判断:
if __name__ == "__main__"
并将所有测试代码移到条件判断之下,即可避免在被导入之后直接执行。
所以test_han模块中的代码应该改成:
def say_hello():
print("HELLO")
if __name__ == "__main__":
print("小明开发的模块")
print(__name__)
say_hello()
条件判断下方的代码为测试代码。
这时候再被导入,就不会直接执行。
代码
代码
代码
def mian()
...
pass
if __name__ == "__main__":
main()
所以在开发的时候,也应该使用上面的格式进行开发,这样才能够被正常被导入使用。
包
包是一个包含多个模块的特殊目录。
目录下有一个特殊的文件__init__.py
包的命名方式与变量名一致
两种方式:
一种新建目录,手动添加__init__.py
文件
一种是直接新建包
可以使用import 包名
一次性导入包中所有模块
要在外界使用包中的模块,需要在__init__.py
中指定对外界提供的模块列表。
from.import 模块名1
from.import 模块名2
注意,这时候就可以直接 import 包名
,而不是模块名,一次性导入所有模块,因为各个模块都已经在__init__.py
中被初始化完毕了。