我的问题特定于scikit-learn python模块,但我在matplotlib上也有类似的问题。
当我想使用 sklearn 时,如果我只执行"导入 sklearn",然后调用我需要的任何子模块,例如"sklearn.preprocessing.scale((",我会收到一个错误"属性错误:"模块"对象没有属性"预处理">
另一方面,当我做"从 sklearn 导入预处理"时然后使用'preprocessing.scale(('它正常工作。
当我使用其他模块(如 Numpy(时,只需"导入 numpy"就足够了,而且效果很好。
因此,我想问是否有人可以告诉我为什么会发生这种情况,如果我做错了什么?
谢谢。
python 包在目录内的__init__.py
文件中定义。此文件确定是否包含子模块。
当你这样做import sklearn
python会找到文件sklearn/__init__.py
并执行它来创建sklearn
模块。此对象绑定到名称 sklearn
。解释器不会隐式导入子模块。
但是,在执行from sklearn import preprocessing
python将首先像以前一样加载sklearn
模块。然后它将检查preprocessing
是否是该模块的属性(例如函数(,如果不是,它将查找文件sklearn/preprocessing.py
并启动该模块。
碰巧numpy
在其__init__.py
文件中执行以下操作:
import .random
因此,当导入 numpy 作为import numpy
时,该模块的执行会触发numpy.random
的导入,然后将其添加为属性。
这很有用,因为有时您只想使用包的一部分,并且加载所有包可能需要大量时间。例如,导入numpy
确实需要半秒钟。如果您只需要其功能的一小部分,这是浪费时间的。
您可能有兴趣阅读包的文档。
Numpy 方便地将其子模块导入其__init__.py
文件中并将它们添加到__all__
中。使用库时,您无能为力 - 它要么做,要么不做。