两个版本均使用cache缓存
逻辑为:首先在缓存里查找mod,如果找到,直接返回,如果没有找到,导入mod存入缓存,再将缓存里的mod返回。
一个版本使用__import___:
class LazyImport(object):
"""使用
os = LazyImport("os", globals(), locals()) # 此时还未导入os,这一行可以写在文件开始,import区域
os.getpid() # 调用__getattr__导入/从cache里获取
"""
def __init__(self, name, globals=None, locals=None, fromlist=None, level=0):
if fromlist is None:
fromlist = []
if locals is None:
locals = {}
if globals is None:
globals = {}
self.cache = {}
self.mod_name = name
self.globals = globals
self.locals = locals
self.fromlist = fromlist
self.level = level
def __getattr__(self, name):
mod = self.cache.get(self.mod_name)
if not mod:
mod = __import__(self.mod_name, self.globals, self.locals, self.fromlist, self.level)
self.cache[self.mod_name] = mod
return getattr(mod, name)
另一个版本使用 importlib.import_module :
class LazyImport(object):
def __init__(self, name):
self.cache = {}
self.mod_name = name
def __getattr__(self, name):
mod = self.cache.get(self.mod_name)
if not mod:
mod = importlib.import_module(self.mod_name)
self.cache[self.mod_name] = mod
return getattr(mod, name)
使用方法:
from aaa import Bbb
def test():
bb= Bbb()
bb.xxx
等同于:
import LazyImport
def test():
bb= LazyImport('aaa').Bbb()
bb.xxx
由于启用了缓存,有部分需要初始化的模块,缓存加载后,是直接从缓存调用,毫秒级返回,全局加载模块非常方便。
请尊重作者劳动,文章禁止转载。
如需转载,向本人说明后,经过同意方可,转载附加上本文章原地址。