Python 模块的使用


什么是模块

在Python中,一个.py文件就被称之为一个模块

模块的调用

模块一旦被调用,即相当于执行另外一个另外一个py文件中的代码,多次import导入同一个模块,只会执行一次。

模块的导入 – import

1
2
3
4
# demo.py
money = 100
def read():
print('in read',money)
1
2
3
4
5
6
7
8
# func.py
import demo
def read():
print('my read func')
money = 200
read() # 自己本地的
print(demo.money) # 调用模块的
demo.read() # 调用模块的

模块导入流程

  1. 先从sys.modules里查看是否已经被导入
  2. 如果没有被导入就依据sys.path路径去寻找模块
  3. 找到了就导入,没有找到就报错
  4. 创建这个模块的命名空间
  5. 执行文件,把文件中的名字都放到命名空间中
  6. sys.modules会加入这个模块,当这个模块再被impoet时就不会被重复导入
1
2
3
4
5
6
import sys
import demo
# sys.modules 是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入
print(sys.modules.keys())
# sys.path 是python的搜索模块的路径list
print(sys.path)

导入模块的顺序

  1. 内置模块 time,re
  2. 扩展模块 pip3安装的 django
  3. 自定义模块 demo

单独导入 – from…import…

1
2
3
from time import sleep
sleep(1)
print('hey')
1
2
3
4
5
6
from demo import read,money
money = 200
def read():
print('my read',money)
read() # my read 200
print(money) # 200

查看结果

1. 如果本地有read()方法则优先调用本地的。

2. 即使导入了money这个变量也无法替代本地变量,会发生冲突。


为什么要使用 from…import?

1. import是导入了模块里面的所有名字 比较占用内存。

2. 导入一个变量进来,占用的内容较少,只要不用重名即可。

1
2
3
4
# 导入多个名字
from demo import money,read
print(money) # 100
print(read) # <function read at 0x0000000000B62620>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 导入全部* 配合 __all__
# 如果在模块中定义了__all__ 那么如果import * ,只有存在这个列表中的名字才能调用
# import demo 不受这个约束

# demo
__all__ = ['money','read'] # 只和 from demo import * 能配合起来
money = 100
def read():
print('in read',money)
def read2():
print('in read2',money)

# func
from demo import *
print(money) # 100
read() # in read 100
read2() # NameError: name 'read2' is not defined

把模块当做脚本执行

我们可以通过模块的全局变量name来查看模块名:

1
2
3
4
5
# demo2
print(__name__) # __main__

# func
import demo2 # demo2

  1. 当我在文件中import demo2的时候,demo2中的print(__name__)执行返回的是demo2
  2. 当我在demo模块中print(__name__)的时候返回的是 __main__
  3. 在哪个页面页面上点的run 在哪个页面上就是__main__
  4. 如果不在本页面上执行,在其他页面上调用模块名导入执行,那么就返回模块名

if name == ‘main‘: 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# demo2
def login():
print('正在执行登录程序')

if __name__ == '__main__':
print('in demo2.py') # in demo2.py
ret = login() # 正在执行登录程序
print(ret) # None

# func
import demo2
ret = demo2.login() # 正在执行登录程序
print(ret) # None

# 这样就符合了:模块导入的时候什么都不执行,所有想做的都放在模块里面去,在执行程序的时候就不会受影响,也能调用模块中想要的名字