Python 子类不';无法识别父类的模块导入?

Python 子类不';无法识别父类的模块导入?,python,python-module,Python,Python Module,我在两个不同的模块中有两个类: animal.py monkey.py animal.py: import json class Animal(object): pass import animal class Monkey(animal.Animal): def __init__(self): super(Monkey, self).__init__() # Do some json stuff... 猴子: import jso

我在两个不同的模块中有两个类:

  • animal.py
  • monkey.py
animal.py:

import json

class Animal(object):
    pass
import animal

class Monkey(animal.Animal):

    def __init__(self):
        super(Monkey, self).__init__()

        # Do some json stuff...
猴子:

import json

class Animal(object):
    pass
import animal

class Monkey(animal.Animal):

    def __init__(self):
        super(Monkey, self).__init__()

        # Do some json stuff...
当我尝试实例化一个
猴子时,我得到一个

NameError:未定义全局名称“json”

但是我正在超级类的定义模块中导入
json
,为什么不加载它呢?

它已加载,但它的名称在
monkey.py
的范围内不可用

您可以键入
animal.json
来获取它(但您为什么要这么做),或者只需键入

import json

monkey.py中也可以使用。Python将确保模块不会被加载两次。

好吧,Python导入不起C#include预处理器指令的作用。它们只将模块导入导入模块的命名空间,而不导入全局命名空间。所以,你必须在你打算使用它的每个模块中导入json。

所以我认为我将模块导入到不使用它们的基类中是没有意义的?是的,你应该只导入你在文件中使用的模块。一般来说,我同意Bjorn,但有时从另一个模块中引用模块可能更方便,例如,当一个模块从其他模块中捆绑了许多功能时。我确信我很清楚:没有全局导入,对吗?基本上是正确的。这是一种防止名称冲突的语言功能;例如,如果我的模块级变量与某个随机模块导入的对象具有相同的名称,该怎么办?我说“基本正确”,因为您可能会编写一个导入后钩子,动态地将新导入的模块添加到所有已导入模块的“全局”范围中。这是邪恶的;不要这样做。“只供导入模块使用”这不是真的。见托马斯的回答。