模块与包
一个python文件有两种用途:
1、被当成程序运行
2、被当做模块导入
模块:
1.import....
一个py文件就可以作为一个模块
模块的导入:直接导入文件的名字,不需要带着后缀
模块中的函数调用:模块名.函数名()
首次导入模块会发生3件事:
- 执行foo.py
- 产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中
- 在当前文件中产生的有一个名字foo,该名字指向2中产生的名称空间
包:包就是含有__init___.py 的文件夹
包的本质就是模块的一种形式,包可以被当做模块来导入导包的时候执行的是__init___.py 的文件夹
强调:
- 无论import 还是 from... import...导入的时候点的左边必须是包,否则就会报错
- 包A和包B同名模块也不会冲突,因为他们是来自不同的空间
- import导文件的时候产生名称空间的名字来源于源文件
- import导包的时候产生名称空间的名字来源于源文件包下的init,其实导包就相当于导文件
import 与 from..import..导模块:
impot导入模块在使用时必须加前缀"模块."
优点:肯定不会与当前名称空间中的名字冲突
缺点:加前缀显得麻烦
import foo
print(foo.x)
print(foo.get)
print(foo.change)
from ... import ...导入也发生了三件事
1、产一个模块的名称空间
2、运行foo.py将运行过程中产生的名字都丢到模块的名称空间去
3、在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址
from foo import x
from foo import get
from foo import change
from...impot...导入模块在使用时不用加前缀
优点:代码更精简
缺点:容易与当前名称空间混淆
from foo import x # x=模块foo中值1的内存地址
x=1111
*:导入模块中的所有名字
name='egon'
from foo import *
print(name)
# 起别名 as
from foo import get as g
print(g)
无论是import还是from...import在导入模块时都涉及到查找问题
优先级:
1、内存(内置模块)
2、硬盘:按照sys.path中存放的文件的顺序依次查找要导入的模块