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

image-20250830201446641

(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:可以使用相对路径(试过,容易报错,搞混),万一包的名字改变了,使用相对路径不会对保内文件造成任何影响

注意:.前面必须是一个包,不能是一个模块。

.当前

..上一级

...上一级的上一级

执行文件不能用相对路径,只能被当做模块导入时候才能用。

使用绝对路径是相对于执行文件而言,而相对路径相对于文件本身而言。

posted @ 2025-08-31 11:22  bokebanla  阅读(8)  评论(0)    收藏  举报