导入模块

在Python中使用关键字import导入模块, 其用法主要有:

  • import ...
  • from ... import ...

import ...

把指定的模块作为一个整体导入到当前作用域中, 使用模块中的成员(变量, 函数或类)时, 需要用模块名作为前缀.

from ... import ...

把一个模块中的指定成员(变量, 函数或类)导入到当前作用域中, 导入后, 在当前作用域中可以直接使用导入的成员(不需要使用模块名作为前缀).

给导入的模块重命名

  • 使用关键字as
import A as B
  • 使用赋值语句
import A
B = A
del A

导入模块的本质

  • 使用import ...导入模块的本质就是: 将.py文件中的全部代码加载到内存并执行, 然后将整个模块内容赋值给与模块同名的变量, 该变量的类型是module, 而在该模块中定义的所有程序单元都相当于该module对象的成员;
  • 使用from ... import ...导入模块中的成员, 其本质是: 将.py文件中的全部代码加载到内存并执行, 然后只导入指定的变量, 函数或类, 并不会将整个模块导入.

总结

  • 如果在一个导入语句中导入多个模块/包, 它们之间用逗号分隔, 但通常不建议这么做, 建议每个导入语句只导入一个模块/包;
  • 导入语句可以出现在程序中的任何位置, 但同一个模块只会被导入依次, 不管执行了多少次import;
  • 不论是import还是from ... import ... , 不论是导入模块还是导入包, 都不会递归导入;
  • 导入时, 需要注意导入的名称和当前作用域中的名称之间可能的冲突问题;
  • 导入一个模块, 就是导入模块的内容, 模块的内容存储在.py文件中, 所以导入模块就是导入相应的.py文件; 对于一个包, 它对应的.py文件就是它的__init__.py文件, 所以导入一个包, 就是到__init__.py文件;
  • 导入一个包时, 只是导入该包的__init__.py文件, 不会递归导入该包中的模块和子包;
  • from ... import *语句会导入内容中(包的__init__.py文件中或模块文件中)的__all__变量定义的所有名称, 如果没有定义__all__变量, 则导入所有没有以两个下划线开头的名称(应该尽量避免使用这种导入方式).