python package module 反射

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,当你定义了allinit.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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容