1. 模块相关的基本知识
(1)模块导入位置
所有的模块导入都应该尽量写在开始
(2)模块导入顺序
内置 > 扩展 > 自定义
(3)模块是否会被重复导入
sys.moudles
(4)从哪儿导入模块
sys.path
# 模块为什么不会被重复导入? # 先从sys.modules里查看是否已经被导入 # 如果没有被导入就依据sys.path路径去寻找模块 # 找到了就导入模块,没找到就报错 # 导入之前,创建这个模块的命名空间 # 执行文件,把文件中的名字都放到命名空间里 import sys print(sys.modules) # 检查模块是否已被导入 print(sys.modules.keys()) print(sys.path) # 导入模块的路径
2. 模块的导入方式
(1)import 模块名
调用:模块名.变量名
导入的模块有独立的命名空间,和本文件中变量名完全不冲突
import demo # in demo.py def read(): print('in my own',money) money = 200 demo.read() # in demo 100 print(demo.money) # 100
(2)import 模块名 as 重命名的模块名
提高代码的兼容性
import time as t # 给time取别名为t print(t.time()) # 可以直接用别名操作 1539069128.1001534 # print(time.time()) # 报错:重命名之后,原名字不可以用
(3)import 模块名1,模块名2,模块名3,... 【少用】
(4)from ... import ...
<1> from 模块名 import 变量名
直接使用变量名就可以完成操作
和本文件中重名的变量名会发生冲突
<2> from 模块名 import 变量名 as 重命名变量名
<3> from 模块名 import 变量名1,变量名2,变量名3,...
<4> from 模块名 import * 【少用】
将模块中的所有变量名都放到内存中
和本文件中重名的变量名会发生冲突
from 模块名 import * 和 __all__ = ['变量名1','变量名2',...]是一对
有__all__,就只导入all列表中的名字
没有__all__,就导入所有名字
# demo.py中有__all__ = ['money']时 from demo import * print(money) # 100 read() # 报错 # demo.py中没有__all__ = ['money']时 from demo import * print(money) # 100 read() # in demo 1 100
# demo.py __all__ = ['read','read2'] money = 100 def login(): print('正在执行此登陆程序') def read(): print('in demo read()',money) def read2(): print('in demo read2()') # 需求:执行demo.py时,执行打印 # 导入demo时,不执行打印 # 在demo.py 中执行时才执行下面代码 if __name__ == '__main__': ret = login() print(ret) print('hello') # print(__name__) # demo : 在 03 模块.py 中执行 # __main__ : 在demo.py 中执行
在模块中,有一个变量__name__
直接执行此模块时:__name__ == __main__
在其他模块中引用此模块执行时,__name__ == __模块的名字__