如果我这样做
import matplotlib as mpl
mpl.colorbar
- >由于colorbar是一个子模块而不是属性,我收到错误:
'模块'对象没有属性' colorbar'
如果我这样做(在此之前添加另一个导入):
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.colorbar
它有效,我得到了
模块' matplotlib.colorbar'
这怎么可能!?我的意思是,我认为colorbar
是plt
的有效属性,但它是如何进入mpl
的?为什么之前导入第二行中的某些内容会修改mpl
后locals()
中覆盖的.html
对象?!
即使这是matplotlib特有的,似乎我对python的一般理解需要更新:)
它没有
答案 0 :(得分:1)
考虑以下文件结构。
我们有两个包aaa
和bbb
。 bbb
有一个子模块submodule.py
。
文件内容:
<强> aaa/__init__.py
强>:
import bbb.submodule
print("package aaa init")
<强> bbb/__init__.py
强>:
print("package bbb init")
<强> bbb/submodule.py
强>:
print("submodule loaded")
如果我们现在使用以下行运行test.py
import bbb
print(bbb.submodule)
我们收到错误
AttributeError: 'module' object has no attribute 'submodule'
因为尚未加载子模块。
但是,如果我们将text.py
更改为导入aaa
,它本身也会导入bbb
import aaa
import bbb
print(bbb.submodule)
输出
package bbb init
submodule loaded
package aaa init
<module 'bbb.submodule' from '...\packagestest\bbb\submodule.py'>
因此,在这种情况下,bbb.submodule
将被正确找到,因为它之前已由aaa
包加载。
请注意,导入顺序无关紧要。以下同样适用
import bbb
import aaa
print(bbb.submodule)
现在将aaa
替换为matplotlib.pyplot
,将bbb
替换为matplotlib
,将submodule
替换为colorbar
- 效果相同:
pyplot
将加载matplotlib.colorbar
,因此在调用mpl.colorbar
时可以将其作为子模块使用。如果未导入pyplot
,则无法找到mpl.colorbar
。
答案 1 :(得分:0)
总而言之,仅导入matplotlib
是不够的。您还要做的是import pyplot
,因为它是matplotlib
的子模块,而不是函数(您不能调用它)。
如果您只是import matplotlib
而不是pyplot
,然后尝试从控制台调用pyplot
,则会看到。你得到相同的错误信息。我同意它有点违反直觉,但你必须import pyplot
作为matplotlib
额外的一部分才能允许调用仅作为子模块的一部分而不是主模块的函数。在这种情况下,由于colorbar
中只有matplotlib
,但只有pyplot
,因此您必须import
这两个模块。