在模块中定义
__all__ = []
不多言,主要是影响from <> import *
作为这一章节的延伸,将介绍延迟导入。如图所示,__init__.py文件一次导入所有必需的组件的。但是对于一个很大的模块,可能你只想组件在需要时被加载。 要做到这一点,__init__.py有细微的变化:
# __init__.py
def A():
from .a import A
return A()
def B():
from .b import B
return B()
在这个版本中,类A和类B被替换为在第一次访问时加载所需的类的函数。对于用户,这看起来不会有太大的不同。 例如:
>>> import mymodule
>>> a = mymodule.A()
>>> a.spam()
A.spam
>>>
延迟加载的主要缺点是继承和类型检查可能会中断。需要稍微改变代码,例如:
if isinstance(x, mymodule.A): # Error
...
if isinstance(x, mymodule.a.A): # Ok
...
有时需要重新加载模块
import imp
imp.reload(mo_test)
它实质是重新编译文件并将变量指向编译后的文件,因为变量指向更新了,在同一进程中的不同线程看来这一变动是共享的,在不同进程中则不然,除非重启进程。
需要注意的是如果其它语句使用from import 格式从同一模块中导入了变量,reload并不会同时更新它,
它也不会重新执行__init__.py中的导入语句,所以如非必要,不要使用它。
>>> from mo_test.mo_test2 import k
>>> k
45
# k值改为56; k = 56
>>> imp.reload(mo_test2)
<module ‘mo_test.mo_test2‘ from ‘E:\\python\\code test\\mo_test\\mo_test2\\__init__.py‘>
>>> k
45
>>> mo_test.mo_test2.k
56
参考文档:https://docs.python.org/3/library/imp.html
importlib支持传入字符串来引入一个模块。
import importlib
mo_test = importlib.import_module(‘mo_test‘)
# 注意返回的是一个模块对象,所以需要声明一下变量,否则会在命名空间中找不到模块变量。
原文:https://www.cnblogs.com/wodeboke-y/p/10480518.html