Python的包(package)和模块(module)的区别,如何导入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文件可以将常用的一些变量、函数、甚至模块和类导入以方便调用。

猜你喜欢

转载自blog.csdn.net/TylerDu/article/details/107359152
今日推荐