package
一个package 被导入,不管在什么时候__init__.py的代码都只会被执行一次
__init__.py内的导入顺序
- __init__.py 文件内变量
- 是不是package内的subpackage
- 是不是package内的module
simple_package已经被成功导入,但是a.py和b.py并没有被导入
第一种就是在init.py内导入a或者b模块,然后保存再激活python的交互环境第二办法就是手动导入,当你想使用模块a中的bar()函数时,需要手动导入
例子
sound
|-- effects
| |-- echo.py
| |-- __init__.py
| |-- reverse.py
| `-- surround.py
|-- filters
| |-- equalizer.py
| |-- __init__.py
| |-- karaoke.py
| `-- vocoder.py
|-- formats
| |-- aiffread.py
| |-- aiffwrite.py
| |-- auread.py
| |-- auwrite.py
| |-- __init__.py
| |-- wavread.py
| `-- wavwrite.py
`-- __init__.py
如果你希望python帮你自动导入sound.effects你可以往sound目录下的__init__.py文件写入
"""An empty sound package
This is the sound package, providing hardly anything!"""
import sound.effects
print("sound package is getting imported!")
除了使用绝对路径你可以使用相对路径来导入sound.effects
这跟linux的命令行比较像,.代表当前目录,..代表上级目录
"""An empty sound package
This is the sound package, providing hardly anything!"""
from . import effects
print("sound package is getting imported!")
__all__
我们尝试使用*来进行全部的导入
>>> from sound import *
sound package is getting imported!
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
我们可以使用__all__这个魔法变量来手动导入模块和子package,当你定义了all到init.py文件以后,python会根据你在list内给出的元素进行逐个导入
__all__ = ["formats", "filters", "effects"]
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'effects', 'filters', 'formats']
>>>
package 总结
- 在 from package import * 语句中,如果 __init__.py 中定义了 __all__魔法变量,那么在__all__内的所有元素都会被作为模块自动被导入(ImportError任然会出现,如果自动导入的模块不存在的话)。
- 如果 __init__.py 中没有 __all__ 变量,导出将按照以下规则执行:
** 此 package 被导入,并且执行 __init__.py 中可被执行的代码
** __init__py 中定义的 variable 被导入
** __init__.py 中被显式导入的 module 被导入
反射
反射包
#__init__.py
from . import c
In [6]: import test2
In [7]: getattr(test2,'c').c_f()
b
134
In [3]: import importlib
In [4]: importlib.import_module('test2')
Out[4]: <module 'test2' from '/Users/shilulu/PycharmProjects/geotool/test2/__init__.py'>
In [5]: test2 = importlib.import_module('test2')
In [6]: test2.c.b()
b
In [7]: getattr(test2,'c').c_f()
b
134
反射模块
In [9]: c = importlib.import_module('c')
In [10]: c.c_f()
b
134