Python中每一个包都必须包含__init__.py文件,如果没有该文件,则表示普通目录,不能用于包引入。
例如:
可以认为__init__.py 文件是包的标志,__init__.py可以为空,什么都不写。
如果__init__.py文件为空,引用模块如下,将test引入命名空间,进而访问test的属性和方法
>>> from package1 import test
>>> test
<module 'package1.test' from 'package1\test.py'>
>>> from package1 import * 不能这样写,因为__init__.py为空,相当于把空值引入命名空间,空值没有属性和方法的
>>> test
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'test' is not defined
导入一个包时,实际上是导入了它的__init__.py文件,将__init__.py里面的包和模块导入命名空间,通过命名空间访问导入模块的属性和方法。可以通过编写__init__.py文件控制包的模块引用。
import test
import test1
import test2
或者
__all__ = ['test', 'test1', 'test2']
结果:
>>> from package1 import *
>>> test
<module 'package1.test' from 'package1\test.pyc'>
>>> test2
<module 'package1.test2' from 'package1\test2.py'>
>>> test1
<module 'package1.test1' from 'package1\test1.py'>
这里有个缺点,不能直接访问模块里面具体的方法
>>> from package1 import *
>>> test.fun # 必须model开头引入,因为之前只是将模块引入了命名空间
<function fun at 0x025BB4B0>
>>> fun
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'fun' is not defined
可以将所有的方法也直接写入命名空间 __init__.py文件内容
from test import *
from test1 import *
from test2 import *
>>> from package1 import *
>>> fun
<function fun at 0x025FB470>
总结:
import subpackage1.a # 将模块subpackage.a导入全局命名空间,例如访问a中属性时用subpackage1.a.attr
from subpackage1 import a # 将模块a导入全局命名空间,例如访问a中属性时用a.attr_a
from subpackage.a import attr_a # 将模块a的属性直接导入到命名空间中,例如访问a中属性时直接用attr_a
具体import语句引用机制,可以参考https://www.cnblogs.com/Lands-ljk/p/5880483.html,写的挺好的
本文参考来源: https://www.cnblogs.com/Lands-ljk/p/5880483.html