Python的包(package)和模块(module)的区别,如何导入python包和模块,以及为什么可以把包名当作一个模块导入
程序员文章站
2022-07-10 21:36:21
本文主要讨论标题中的三大问题,接下来逐一分析:文章大部分内容转载并重新整理自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