我准备在sklearn
中讨论Adaboost,但我只是想澄清一下我在概念上的一个小差异。
我已经阅读了this堆栈溢出文章。我还通过一些奇怪的导入错误轻松浏览了一些其他堆栈文章。但是,我仍然对为什么这些代码片段中的一个有效,而另一个代码断开有点困惑。
基本上,我只是搞乱了导入sklearn.ensemble的不同方法。我想因为sklearn是一个包,我们可以这样做:
import sklearn
clf = sklearn.ensemble.AdaBoostClassifier
AttributeError: 'module' object has no attribute 'ensemble'
错误告诉我合奏不是属性。我想这是有道理的,因为合奏本身就是一个包。
这段代码可以解决:
import sklearn.ensemble
clf = sklearn.ensemble.AdaBoostClassifier
我的问题是,区别是什么?如果我们导入一个包,那么引用该超级包中的包不应该没问题吗?为什么不允许这样做?随意链接我的文档,但我不确定最好的地方。
谢谢!
答案 0 :(得分:1)
单独使用时,import
关键字后跟一个模块,而不是包:
import my_module
如果要导入的模块位于包中,则可以使用点表示法导入该模块:
import my_package.my_module
出现混淆是因为包的名称也可以用作该包中__init__.py
模块的名称。
当您import sklearn
时,您不是import
所有包裹内容,而只是sklearn.__init__.py
模块。
因此:
import sklearn #imports the contents of sklearn.__init__.py
import sklearn.ensemble # imports the contents of sklearn.ensemble.py
导入内容的另一种方法是构造
from <module> import <attributes>
在这种情况下,类似的规则适用:from
键盘后跟一个模块,而不是一个包。所以,如果
from sklearn import an_awesome_function
然后您要导入模块an_awesome_function
中定义的sklearn.__init__.py
,该模块是包sklearn
的一部分。