理解python中的module以及package

在学习scrapy的过程中,我运行自己写好的实例代码后发现,居然找不到spider module,由于自己也不是很能理解module的意思,于是上网查了一下module的含义,没想到还有附加的package送给我,写博客的主要原因就是希望自己以后对这块内容印象不深刻、遗忘了的时候,能够迅速对自己遗忘了的东西查漏补缺。

如果看见博客哪里写得不好的或者不到位的,麻烦大家尽情指出问题,谢谢!

———————————————————————————————————————————————————————————————

Python Module

Python Module的含义很简单,即一个python文件,以.py为后缀的文件,包含了Python的对象定义、Python语句。

我们平时无聊写写python代码的时候,也许就只是在同级目录下面创建py文件,对package的接触可能并不会特别频繁,当我们之后接触一些复杂项目的时候,package的重要性也逐渐体现出来。

Python Package

同样Python Package的含义我们也可以简单地去理解,当python中一个项目目录里面存在__init__.py文件的时候,这个目录就不是纯粹的文件夹,而叫做Python package,且不论_init_.py文件中的内容是否为空,该目录都会被Python认为是一个Package。
Package的初始化工作

怎么去理解Package的初始化工作呢,指的是当一个package被导入或者引用的时候,package当中的_init_.py文件中的内容只会被执行一遍,因此我们在编辑_init_.py文件的时候,我们考虑好代码之间是否会相互影响,最好封装成类、函数之类的。

假设我们的模块包如图所示
└─sound
init.py

├─effects
│ │ echo.py
│ │ reverse.py
│ │ surround.py
│ │ init.py
│ │
│ └─__pycache__
│ echo.cpython-37.pyc
init.cpython-35.pyc
init.cpython-37.pyc

├─filters
│ │ equalizer.py
│ │ karaoke.py
│ │ vocoder.py
│ │ init.py
│ │
│ └─__pycache__
│ karaoke.cpython-35.pyc
init.cpython-35.pyc
init.cpython-37.pyc

├─formats
│ │ aiffread.py
│ │ aiffwrite.py
│ │ auread.py
│ │ auwrite.py
│ │ wavread.py
│ │ wavwrite.py
│ │ init.py
│ │
│ └─__pycache__
init.cpython-35.pyc
init.cpython-37.pyc

└─__pycache__
init.cpython-35.pyc
init.cpython-37.pyc

我首先在sound根目录下的_init.py写入这一段代码

扫描二维码关注公众号,回复: 10281823 查看本文章
print("sound package is getting imported!")

我们先导入sound package看看效果:

import sound
sound package is getting imported!

看来sound根目录下的_init.py被成功地自动执行


现在我们玩一点复杂的

我们首先在sound根目录下的_init.py里面再写入代码

import sound.effects
import sound.filters
import sound.formats

再看一看效果

sound package is getting imported!
effects package is getting imported!
filters package is getting imported!
formats package is getting imported!

可以看出sound下的子package都被导入了
那我们能不能在sound根目录_init_.py下面只写一段导入再换个方式把所有子package给导入呢?
我们先重新输一下sound根目录下的_init_.py代码
代码如下:

print("sound package is getting imported!")
import sound.sound.effects

然后我们进到effects目录下面的_init_.py文件里继续码代码哈哈哈

from .. import filters
from .. import formats

这里说明一下python 中的…和linux一样代表着上级目录,.代表着当前所在的目录,有时候
再去执行一下看看效果,结果如下:

sound package is getting imported!
effects package is getting imported!
filters package is getting imported!
formats package is getting imported!

我们再最后做两个实验来验证_init_.py文件

  1. 实验一
    先在与sound同级目录下创建一个py文件,代码如下

    from sound.sound.effects import echo
    sound package is getting imported!
    effects package is getting imported!
    filters package is getting imported!
    formats package is getting imported!
    Module echo.py has been loaded!
    

    有点神奇
    这说明不论引用还是导入只要和相应的package有纠葛、关系,那么_init_文件就会被相应地去执行

  2. 实验二
    在sound根目录_init_.py写入这样一段话,不知道行不行。

from effects import echo
   from effects import echo
ModuleNotFoundError: No module named 'effects'

后来查了一下百度才知道,它不同于linux,即使你认为它是相对路径,不能只单单的输文件名,还需要加上.或者在前面在加上父package才可以,代码如下:

from .effects import echo
运行结果:
sound package is getting imported!
effects package is getting imported!
filters package is getting imported!
formats package is getting imported!
Module echo.py has been loaded!

此博客有部分内容从https://www.cnblogs.com/wcwnina/p/9329086.html,https://www.jianshu.com/p/178c26789011借鉴而来,如有侵犯,请联系作者。

发布了6 篇原创文章 · 获赞 1 · 访问量 196

猜你喜欢

转载自blog.csdn.net/tomm5/article/details/103978148