赞
踩
目录
4.3 Python 3.3 及更高版本中可以不要__init__.py
我们常见__init__.py文件,但说不清楚它的用途,在本文,我将首先把它的来龙去脉说清楚,然后告诉大家,如何编制python工程,培养全局的编程格局。
在Python工程里,当python检测到一个目录下存在__init__.py文件时,python就会把它当成一个包来对待。其内部文件就是模块(module)。Module跟C++的命名空间和Java的Package的概念很像,都是为了科学地组织工程。
关于包
Python 定义了两种类型的包,常规包和命名空间包。常规包是传统包,因为它们存在于 Python 3.2 及更早版本中。常规包通常实现为包含 __init__.py 文件的目录。导入常规包时,隐式执行此 __init__.py 文件,并将其定义的对象绑定到包命名空间中的名称。 __init__.py 文件可以包含任何其他模块可以包含的相同 Python 代码,并且 Python 会在模块导入时添加一些额外的属性。
概念 | 意义 | 表现形式 | 备注 |
---|---|---|---|
包 | 工程, | 命名空间;目录 | 工程内包含许多模块 |
模块 | 工程的部分文件 | python文件 | 模块定义若干函数(或类) |
函数 | 用户的调用单元 | def 函数代码 |
包、模块、函数的关系如下:
包内部有多个模块,模块内部有多个函数。
__init__.py可以是一个空文件,也可以有非常丰富的内容。本文将举一个非常简单的例子,来介绍__init__.py的用法;
它有助于导入其他 python 文件。当您将此文件放在包含其他 py 文件的目录(比如 stuff)中时,您可以执行类似 import stuff.other 的操作。
- root\
- stuff\
- other.py
- morestuff\
- another.py
如果目录 stuff 中没有这个 __init__.py,您将无法导入 other.py,因为 Python 不知道 stuff 的源代码在哪里,也无法将其识别为包。
文件add_sub.py内:
- # @file add_sub.py
-
- def add(a, b):
- return a + b
-
- def sub(a, b):
- return a - b
'运行
文件div_mul.py内:
- # @file div_mul.py
-
- def mul(a, b):
- return a * b
-
- def dev(a, b):
- return a / b
'运行
制作一个调用函数文件:
main.py代码如下:
- from package.add_sub import *
- from package.div_mul import *
- x = 101
- y = 33
- print( add(x,y))
- print( sub(x,y))
-
- print(dev(x,y))
- print(mul(x,y))
-
- >>>
- 134
- 68
- 3.0606060606060606
- 3333
到此,工程包运行正常。
但是有一个问题:
from package.add_sub import *
from package.div_mul import *
这种调用模式是穷举的,如果有100个模块,那么,用户将写出100个import语句,如何简化之?
- from package.add_sub import *
- from package.div_mul import *
在main,py文件可以写成:
- from package import *
- x = 101
- y = 33
- print( add(x,y))
- print( sub(x,y))
-
- print(dev(x,y))
- print(mul(x,y))
这好比将客户端写的:
from package.add_sub import *
from package.div_mul import *
转移到init,然后将init作为笼统名称交代给main函数。
在init中可以过滤模块的函数,具体实现是在init中加入列表:
__all__ = ['add',‘mul’]
这样,客户端只能使用'add',‘mul’函数,不可用其它函数了。
在init中设置变量:
FOO = "Hello world"
于是在导入包后,任何地方都可以用FOO变量。
在 Python 3.3 及更高版本中,不再需要 __init__.py 文件来定义包。这是因为作为导入系统核心的 importlib 模块已更新为自动检测包而无需 __init__.py 文件。这意味着您只需创建一个目录并将模块文件放入其中即可创建包,而无需创建 __init__.py 文件。见文章:
The '__init__.py' File: What Is It? How to Use It? (Complete Guide)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。