欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python的包(package)和模块(module)的区别,如何导入python包和模块,以及为什么可以把包名当作一个模块导入

程序员文章站 2022-04-16 08:24:34
本文主要讨论标题中的三大问题,接下来逐一分析:文章大部分内容转载并重新整理自https://zhuanlan.zhihu.com/p/339131311. Python的包(package)和模块(module)的区别首先分清python中模块、库、包之间的概念差异:模块(module)其实就是py文件,里面定义了一些函数、类、变量等包(package)是多个模块的聚合体形成的文件夹,里面可以是多个py文件,也可以嵌套文件夹库是参考其他编程语言的说法,是指完成一定功能的代码集合,在python...

本文主要讨论标题中的三大问题,接下来逐一分析:

文章大部分内容转载并重新整理自https://zhuanlan.zhihu.com/p/33913131

1. Python的包(package)和模块(module)的区别

首先分清python中模块、库、包之间的概念差异:

  • 模块(module)其实就是py文件,里面定义了一些函数、类、变量等
  • 包(package)是多个模块的聚合体形成的文件夹,里面可以是多个py文件,也可以嵌套文件夹
  • 库是参考其他编程语言的说法,是指完成一定功能的代码集合,在python中的形式就是模块和包
# first.py
a = 1
def myfun(s):
	print(s + 1)

比如上面的first.py文件就是一个模块,可以用import first导入,里面变量都要用first.前缀来引用,如果想不使用这个前缀可以这样

>>> from first import a
>>> a    #cmd窗口会输出1

2. 如何导入python包和模块

模块的导入我们上面已经看到了, 就是直接import 文件名即可
接下来看看包的导入:
假如我们的文件结构为:

trymodule
│   first.py
├───folder1
│       │   abcd.py
│       │   __init__.py

我们在trymodule文件夹下打开命令行,进入python交互模式
我们来看一下下面几种导入方式

>>> import folder1
>>> folder1.abcd.b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'folder1' has no attribute 'abcd'

>>> from folder1 import abcd
>>> bob = abcd.Myclass(name = 'Bob', age = 20)
>>> bob.name
'Bob'
>>> bob.get_info()
my name is Bob and age is 20

>>> from folder1.abcd import b
>>> b
2

>>> import folder1.abcd
>>> abcd.b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'abcd' is not defined
>>> folder1.abcd.b
2

>>> import folder1.abcd as aa
>>> aa.b
2

结论

  • 只是导入包不能随便使用其中的模块,要导入到具体模块或者变量的层次
  • 文件夹与文件之间可以用.也可以用from import格式,而文件与里面的变量之间只能用from import格式,即不能import folder1.abcd.b

3. 为什么可以把包的名字当作一个模块导入

  • [1] 这里就不得不先提到特殊的__init__.py文件, 在上面的例子中我们看到folder1文件夹中有一个__init__.py文件,这个文件是必要的,否则程序会将这个文件夹当成普通文件夹来处理而不是一个包。这个__init__.py文件中可以什么都不填。
  • [2] __init__.py相当于名为folder1的模块,即如果使用import folder1则可以调用在__init__.py文件中定义的变量。

所以我们就知道下面这段代码看似导入了一个package,但实际上它导入的是这个包下面的__init__.py这个模块,这个特殊模块的名称和自己所在的包名相同

# __init__.py文件
from folder1.abcd import b
c = 3

在trymodule文件夹下打开命令行,进入python交互模式

>>> import folder1
>>> folder1.c
3
>>> folder1.b
2
>>> from folder1 import b
>>> b
2

对比之前的from folder1.abcd import b,使用__init__.py文件可以将常用的一些变量、函数、甚至模块和类导入以方便调用。

本文地址:https://blog.csdn.net/TylerDu/article/details/107359152