如何在按需导入时仅执行目标类的初始化代码
本文介绍如何利用 Python 3.7 的 __getattr__ 魔术方法实现“按需加载并执行类定义体中的顶层语句”确保仅在显式导入特定类如 from x import classY时才触发其内部打印等副作用避免模块级类定义导致的全局执行问题。 本文介绍如何利用 python 3.7 的 __getattr__ 魔术方法实现“按需加载并执行类定义体中的顶层语句”确保仅在显式导入特定类如 from x import classy时才触发其内部打印等副作用避免模块级类定义导致的全局执行问题。在标准 Python 中类定义体class body内的语句会在类被定义时立即执行——而非实例化或导入时。因此若 x.py 中直接定义多个类并包含 print()所有语句会在模块首次被导入哪怕只是 import x时一并执行。这与用户期望的“仅导入 classY 时才打印 Executed class Y!”相悖。要实现真正的惰性类加载与按需执行核心思路是延迟类的定义时机将其封装在 __getattr__ 中。该函数自 Python 3.7 起支持模块级使用见 PEP 562当从模块中访问一个不存在的属性如 from x import classY 中的 classY时被调用从而提供拦截与动态生成的能力。? 推荐方案模块级 __getattr__ 动态 exec这是最灵活、语义清晰且兼容原生导入语法的方式。以下是完整可运行示例文件 x.py# 定义类源码字符串延迟执行CLASS_DEFS { classY: class classY: print(Executed class Y!), classZ: class classZ: print(Executed class Z!)}def __getattr__(name): 拦截未定义的属性名动态执行对应类定义 if name in CLASS_DEFS: # 在当前模块全局命名空间中执行类定义 exec(CLASS_DEFS[name], globals()) # 返回刚定义的类对象 return globals()[name] raise AttributeError(fmodule {__name__} has no attribute {name})使用效果 Mokker AI AI产品图添加背景