本文最后更新于:2025年12月18日 上午
Python 包功能多时按需加载很实用,本文记录
__getattr__实现类似功能的方法。
原理解析
__getattr__ 可以实现包的懒加载,它的核心思想是:当用户在模块中访问一个尚未定义的属性时,Python 会调用 __getattr__(name) 方法。我们可以在这里拦截请求,动态导入对应的模块。
- 举例说明
以我的 vvdutils 库为例,这个库中包含了 MongoGridFSConnection 模块,用户可以调用 from vvdutils import MongoGridFSConnection 引用该功能,如果用 __getattr__ 的视角来看这个过程是这样的:
- 用户执行
from vvdutils import MongoGridFSConnection。 - 如果
MongoGridFSConnection不在vvdutils模块的全局变量中,Python 触发__getattr__(‘MongoGridFSConnection’)。 - 我们在
__getattr__中根据预设的映射表,找到MongoGridFSConnection实际位于vvdutils.mongofs.connect模块。 - 动态导入
vvdutils.mongofs.connect模块,并从中取出MongoGridFSConnection类。 - 将这个类缓存到
vvdutils模块的全局变量中,然后返回给用户。 - 下次再访问
MongoGridFSConnection时,因为已在全局变量中,会直接返回,无需再次导入。
改造示例
示例说明
模块结构:
1 | |
其中 __init__.py 改造前为:
1 | |
该行为会导致每次导入库后会自动导入:
1 | |
__getattr__ 懒加载改造
1 | |
参考资料
文章链接:
https://www.zywvvd.com/notes/coding/python/python-getarrt-lazy-import/python-getarrt-lazy-import/
“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”
微信支付
支付宝支付
Python __getattr__ 懒加载
https://www.zywvvd.com/notes/coding/python/python-getarrt-lazy-import/python-getarrt-lazy-import/