包是指包,它是一个分层的文件目录结构,定义了一个由n个模块或n个子包组成的python应用程序执行环境。通俗的讲:包就是一个目录,里面有一个__init__.py文件,这个目录必须有这个__init__.py文件和其他的模块或子包。
但这会分为两种情况,第一种是空的__init__.py文件,另一种是写有代码的__init__.py文件。无论是空的还是有内容的,这个目录都会被认为是一个包,它是一个标识符。
package的初始化工作
导入包时,__init__.py 中的代码只会执行一次
>>> import package
hello world
>>> import package
>>> import package
由于 __init__.py 中的可执行代码会在导入包时执行,因此请注意将代码放在包中以尽可能消除副作用,例如尽可能将代码封装成函数或类。
__init__.py内的导入顺序
当我尝试导入
from package import something
import 语句会先检查某个东西是否是 __init__.py 的变量,然后检查是否是子包,再检查是否是模块,最后抛出 ImportError。
所以检查顺序如下:
(1)__init__.py 文件内变量
(2)是不是package内的subpackage
(3)是不是package内的module
看个例子
我们有一个如下结构的package
在a.py文件内有一个函数
def bar():
print("Hello, function 'bar' from module 'a' calling")
在b.py文件内有一个函数
def foo():
print("Hello, function 'foo' from module 'b' calling")
然后我们添加一个空的__init__.py 文件在simple_package里面。
让我们看看当我们导入 simple_package 时会发生什么(在 simple_package 中激活 Python shell 或者 simple_package 的路径包含在 python 的 sys.path 或 PYTHONPATH 环境变量中)
>>> import simple_package
>>>
>>> simple_package
<module 'simple_package' from '/home/bernd/Dropbox (Bodenseo)/websites/python-course.eu/examples/simple_package
/__init__.py'>
>>>
>>> simple_package.a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>>
>>> simple_package.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
我们可以看到simple_package已经导入成功,但是a.py和b.py还没有导入
当然,如果要使用 import simple_package 自动加载 a 或 b 模块,有两种方式。
首先是在__init__.py中导入a或b模块,然后保存并激活python交互环境
#__init__.py
import a
import b
当你尝试再次导入 simple_package 时,你可以使用 simple_package.a.bar() 来使用模块 a 中的 bar() 函数。
第二种方式是手动导入。当你想使用模块a中的bar()函数时,需要手动导入
import simple_package.a as a
然后就是可以a.bar()来使用bar()函数了。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python语言有哪些错误12/31
- ♥ Python如何执行js代码12/05
- ♥ 如何测试python API接口11/28
- ♥ 如何在python27中安装pip10/06
- ♥ Python高级架构模式整理01/04
- ♥ python3.6print的使用方法01/08
内容反馈