模块
1.一个python文件就是一个模块
# main.py
import mymodule.py
当导入一个模块,就相当于执行了这个模块,创建该模块的命名空间,将模块中的变量名字放到命名空间里,以后就可以通过模块名.函数
或者模块名.变量
的形式进行调用模块里的数据
2.多次导入同一个模块,只会执行一次
原因:当我import mymodule
的时候,会去查看sys.modules
这个字典中有没有键值为mymodule的模块,没有的话就依据sys.path
路径寻找模块并导入,有的话就不做任何处理。
import mymodule
import sys
for i,j in sys.modules.items():
print(i,j)
结果
.......
mymodule <module 'mymodule' from '/Users/Liang/Documents/PyProject/module/mymodule.py'>
3.给模块取别名
- 模块名太长
import numpy as np
- 对具有相同方法的不同模块统一处理,提高代码的兼容性,例如对于数据库都有连接,登录,增删改查,关闭等相同的操作
if 数据库 == 'oracle':
import oracle as db
elif 数据库 == 'mysql':
import mysql as db
4. 导入模块的顺序(建议遵循)
import 内置模块
import 第三方模块
import 自定义模块
5.from 模块 import 变量名
和import 模块
的区别
import 模块
: 会将该模块中的所有运行产生的变量都导入到内存当中
from 模块 import 变量名
:只是将需要的变量名导入到内存,所以之后无法通过模块.变量名
来引用模块里的任何变量
# module.py
print('我是模块')
money = 200
def read():
print('money:',money)
# main.py
from mymodule import read
print(mymodule.read())
结果
Traceback (most recent call last):
我是模块
File "/Users/Liang/Documents/PyProject/module/main.py", line 2, in <module>
print(mymodule.read())
NameError: name 'mymodule' is not defined
6.模块中__all__
的作用
__all__
和import *
是一对的。
我们知道,当我们from mymodule import *
的时候,会将模块中的所有变量加载到内存,因此,我们在模块中利用__all__
来约束导入的变量,但是对import mymodule
和from 模块 import 变量名
不起作用
# module.py
__all__ = ['money']
print('我是模块')
money = 200
def read():
print('money:',money)
# main.py
from mymodule import *
print(money)
print(read())
输出结果
我是模块
200
Traceback (most recent call last):
File "/Users/Liang/Documents/PyProject/module/main.py", line 3, in <module>
print(read())
NameError: name 'read' is not defined
包
包是一个包含__init__.py
文件的文件夹,该文件夹下可以包含多个模块或者多个包。
导入模块会默认执行模块,导入包会默认执行包里的__init__.py
,因此我们可以在__init__.py
里可以导入模块或者直接定义函数(例如json包就是在__init__.py
定义的dumps
和loads
函数)
有关包的说明:
1 无论是import
形式还是from...import
形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要记住:这是关于包才有的导入语法。
2 import导入文件(模块)时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py
,导入包本质就是在导入该文件。在pycharm中按住ctrl后点击包的时候会跳进包的__init__.py
文件里。
3 关于包相关的导入语句分为import
和from ... import ...
两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
4 对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。
5 需要注意的是使用from ... import ...
导入模块,import后不能带点,否则会有语法错误,如:from a import b.c
是错误语法
结论:以后看别人源码的时候,带点的左边一定是个包,该包下的__init__.py
可能写了一些初始化的数据,也可能导入了相关模块。
网友评论