我的问题是针对scikit-learn python模块的,但我在matplotlib上也遇到了类似的问题。
当我想使用sklearn时,如果我只是做'import sklearn‘,然后调用我需要的任何子模块,比如’sklearn.preprocessing.scale()',我得到一个错误"AttributeError:‘模块’对象没有属性‘预处理’“
另一方面,当我执行“from sklearn import preprocessing”,然后使用“preprocessing.scale()”时,它可以正常工作。
当我使用像Numpy这样的其他模块时,只需“导入numpy”就足够了,而且它工作得很好。
因此,我想问一问,有没有人可以告诉我为何会这样,以及我是否做错了甚麽?
谢谢。
发布于 2016-07-01 19:22:51
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.random作为import numpy导入时,该模块的执行会触发numpy的导入,然后将其添加为一个属性。
这很有用,因为有时您只想使用包的一部分,而加载所有包可能需要大量的时间。例如,导入numpy确实需要半秒左右的时间。如果您只需要其功能的一个非常小的子集,那么这是浪费时间。
您可能会对阅读documentation for packages感兴趣。
发布于 2016-07-01 19:21:18
__all__可以方便地在其__init__.py文件中导入其子模块并将其添加到Numpy中。在使用库时,你对此无能为力--它要么做,要么不做。sklearn显然不是这样。
https://stackoverflow.com/questions/38143991
复制相似问题