Python类的依赖导入位置:模块顶部、类内部还是调用文件?
问题解答
结论
优先将import numpy as np写在myclass.py的模块顶部(即你给出的第一种写法),这是Python开发的通用最佳实践。
各写法的优劣说明
- 写在模块顶部的优势
符合PEP8编码规范,所有依赖一目了然,便于后续维护;导入的numpy作用域覆盖整个模块,类内部的所有方法都可以直接调用np,无需额外前缀。 - 写在类内部的问题
此时np会成为类的属性,方法内直接调用np会触发NameError,必须通过myclass.np或者实例self.np的方式调用才能正常运行,没有特殊需求不推荐这种写法。
仅在两种场景考虑这种写法:一是你希望明确标记这个依赖仅属于当前类使用,减少模块全局命名空间的污染;二是这是可选依赖,类的部分功能不需要该依赖也能运行。 - 写在调用方
other.py的问题
这种写法完全违反封装原则,类的依赖属于实现细节,不应该要求调用方主动导入。如果采用这种写法,所有调用myclass的文件都需要额外导入numpy,后续如果myclass迭代不再依赖numpy,所有调用方都要同步修改导入语句,维护成本极高。
特殊场景的替代方案
如果numpy属于重度依赖,且你在绝大多数场景下使用myclass时都不会调用到需要numpy的方法,可以把导入放到方法内部做延迟加载,降低模块初始化的耗时:
# myclass.py class myclass: # 注意:实例方法必须加self作为第一个参数,否则调用时会报错 def mymethod(self): import numpy as np return np.array([1,2,3,4])
额外提示
你给出的示例代码中mymethod没有加self参数,作为类的实例方法,运行时会触发参数不匹配的报错,需要补充self参数。
内容的提问来源于stack exchange,提问作者Filibuster
相关产品推荐
相关产品推荐

