当我尝试使用pyplot
中的matplotlib
时:
import matplotlib
print matplotlib.pyplot # just checking
它给了我AttributeError: 'module' object has no attribute 'pyplot'
可以通过以下方式解决:
import matplotlib.pyplot
但我真正感到困惑的是,
import numpy
print numpy.random
给了我<module 'numpy.random' from '/Applications/Canopy.app/appdata/canopy-1.0.3.1262.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages/numpy/random/__init__.pyc'>
两种情况有什么区别?在第一个示例中无法调用pyplot
,但random
位于第二个示例中。我认为它与某种软件包和模块有关。但我对蟒蛇不是那么专业,因此要求回答。
答案 0 :(得分:5)
对于权威性教程read this。
但是对于你的具体情况,看起来就是这样:
每个基于目录的python模块(如matplotlib
和numpy
)都有一个__init__.py
文件,用于确定带入模块顶级范围的内容。默认情况下(当__init__.py
为空时),范围内没有任何内容。
但是,某些模块(如numpy
)决定通过向__init__.py
添加import语句将功能提升到顶层。这会将这些子模块纳入范围,即使您只是显式导入了numpy
。
要检查我们的假设,让我们来看看来源!
__init__.py
不包含声明import pyplot
。__init__.py
确实包含import random
,位于第176行。答案 1 :(得分:0)
似乎在模块的__init__.py
中,当您编写语句时,它可以使用变量__all__
来控制要在当前作用域中导入的变量或函数:{{ 1}};我认为它也适用于语法from modulename import *
;在numpy的import modulename
文件中,我找到以下代码:
__init__.py