在`import`-statement之前更改模块对象?

时间:2017-11-06 16:46:08

标签: python matplotlib python-import

如果我这样做

import matplotlib as mpl
mpl.colorbar

- >由于colorbar是一个子模块而不是属性,我收到错误:

  

'模块'对象没有属性' colorbar'

如果我这样做(在此之前添加另一个导入):

import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.colorbar

它有效,我得到了

  

模块' matplotlib.colorbar'

这怎么可能!?我的意思是,我认为colorbarplt的有效属性,但它是如何进入mpl的?为什么之前导入第二行中的某些内容会修改mpl locals() 中覆盖的.html对象?!
即使这是matplotlib特有的,似乎我对python的一般理解需要更新:)

它没有

2 个答案:

答案 0 :(得分:1)

考虑以下文件结构。

enter image description here

我们有两个包aaabbbbbb有一个子模块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)

Answer to similar Question

总而言之,仅导入matplotlib是不够的。您还要做的是import pyplot,因为它是matplotlib的子模块,而不是函数(您不能调用它)。

如果您只是import matplotlib而不是pyplot,然后尝试从控制台调用pyplot,则会看到。你得到相同的错误信息。我同意它有点违反直觉,但你必须import pyplot作为matplotlib额外的一部分才能允许调用仅作为子模块的一部分而不是主模块的函数。在这种情况下,由于colorbar中只有matplotlib,但只有pyplot,因此您必须import这两个模块。