Python包和模块的区别

Python中包(package)和模块(module)的区别是什么?

一般我们用import导入所需的包或者模块的时候,我们其实是不需要区分模块和包的区别的,我自己之前也一直以为这两个词语是同一个意思。但是其实这是两个不同的概念。

任何以.py结尾的Python文件都是模块(package),模块的名字就是文件名(不加.py),不过有时候模块的名字也可以通过模块的__name__重新指定。

包是多个模块的组合。如果一个文件夹下包括多个.py文件和一个__init__.py文件(对于python2需要__init__.py),那么这个文件夹就算是一个包。init.py文件就是专门用来帮助解释器区分所在文件夹到底是普通文件夹还是python包的。你可能有疑问:为什么Python3之后不需要__init__.py了呢?答案见我写的另一个文章。包可以嵌套到任何深度,只要相应的目录包含它们自己的__init__.py文件。

当我们导入模块或包时,Python创建的相应对象始终是模块类型。也就是说无论是一个.py文件(模块)还是一个文件夹(包),一旦被导入之后,它的类型都变成了模块(读者可以通过type(module_name)来测试一下。我自己通过python的debug模式显示了一下我导入的几个包,类型都是module)。

在这里插入图片描述
这意味着模块和包之间的区别仅在于文件系统级别,一旦被解释器导入到python中就没有区别了,都成为了模块(module)对象。这也就是为什么我们一般使用过程中注意不到他们的区别。换句话说,当.py文件和包含多个.py文件和__init__.py文件的文件夹没有被python解释器导入的时候,它们可以被叫做python的模块和包,但是一旦被导入,它们都只能叫做模块。所以也可以说: It’s important to keep in mind that all packages are modules. Package is just a module with a path attribute.

包也是特殊的模块,相比于普通模块,由于它是文件夹,所以多了一个__path的属性。比如读者可以自己在电脑测试一下自己numpy的__path__是什么,下图是我的numpy的路径属性测试。
在这里插入图片描述

自己的模块和python自带的模块重名了怎么办?

尽量不要重名。一旦重名的话,import model_name时候到底是导入自定义的模块还是python自带的模块呢?
答案:具体模块查询顺序查看这里。简单来讲,python解释器会先查询内置模块看是否有需要导入的模块,再从sys.path所包括的文件夹查询模块名字。所以,如果自定义模块名字与内置模块名字重合会被内置模块名字覆盖掉。但是注意内置模块和python标准库的模块还是不一样的,具体请看这个文章

Reference

  1. What is the difference between a python module and a python package?
  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值