8.4 包
8.4 包
面向过程编程:类似于工厂流水线,机械化,一步一步地
函数-->文件版(模块)-->文件夹(包)
注意:文件名命名不要用中文,以防作为模块文件导入时因为中文命名而报错。
函数太多不便于管理,因此引入包,包,其实本质就是模块。
8.4.1 包的创建与导入
单纯的文件夹,无法作为模块导入,包文件夹可以。包本质是含有__init__.py文件的文件夹,自己创建一个文件夹,在文件中创建__init__.py文件,那么这个文件夹也就是包了。
1. pycharm包的创建
新建Python package-->建好后目录下有个_ init_.py文件。
2. 包的导入
(1) 包文件夹:aaa
(2)执行文件:run.py
(3)包文件和可执行文件在同一目录下,在包文件下创建模块m2
(4)包的导入:
-
要先在包文件夹aaa目录的_ _ init_ _.py文件内导包:from 包名 import 模块文件名
# __init__.py from aaa import m2#m1.py def func1(): print("from func1") -
在run.py文件中:import 包名
使用:包名.模块文件名.函数名import aaa if __name__='__main__': aaa.m2.func1()
3. 包被导入时发生的三件事
(1)打开m1里的 _ _ init _ _ .py文件
(2)Python解释器运行解释 _ _ init _ _.py文件,把 _ _init _ _.py文件里的名字丢入aaa模块的名称空间
(3)导入m1其实就是导入 _ _ init _ _ 里的名字
(4)区别于模块:模块是直接打开文件,包是打开里面的 _ _init _ _.py文件
4. 模块搜索路径
以执行文件为标准,aaa模块搜索路径由run.py(执行文件)决定。
# 看搜索路径
import sys
print(sys.path)
假如,模块内功能太大,需要放入包内,将原来的模块m1放入包aaa中,一旦别人在你改动之后使用你的包,必须得从m1改成aaa,这样不合理。
5. 包的优点
- 优点1:可以不改变模块原先的导入方式,并且简化了模块开发者的管理复杂度。类似于装饰器。
(1) 使用模块
#模块文件m1.py
def f1():
print('from f1')
#run.py
import m1
m1.f1()
(2)使用包
#包文件夹命名为m1 m2,py为m1文件夹中的模块
#m2.py模块文件
def f1():
print('from f1')
#__init__.py
from m1.m2 import f1
#run.py
import m1
if __name__='__main__':
m1.f1()
包的使用场景:导入方式不用改变的情况下建包,要写很多模块的时候写包。
总结:模块本质是文件,包本质是文件夹,包其实是特殊的模块而已。
- 优点2:可以使用相对路径(试过,容易报错,搞混),万一包的名字改变了,使用相对路径不会对保内文件造成任何影响
注意:.前面必须是一个包,不能是一个模块。
.当前
..上一级
...上一级的上一级
执行文件不能用相对路径,只能被当做模块导入时候才能用。
使用绝对路径是相对于执行文件而言,而相对路径相对于文件本身而言。
浙公网安备 33010602011771号