首页 > 解决方案 > “导入模块”和“从模块导入 *”有什么区别

问题描述

我是 python 新手,试图了解“导入模块”和“从模块导入 *”之间的区别。我在想两者都是一样的,因为它们从模块中导入了所有功能,但没有看到。我的困惑源于下面的代码——

import abc
class Minnn(ABC):
    @abstractmethod
    def calculate(self, x):
        pass  # empty body, no c

当我运行时,我收到以下错误消息“NameError: name 'ABC' is not defined”。当我用“from abc import *”替换第一个导入行时,它就可以工作了。那么为什么这会导致差异

标签: python

解决方案


导入模块会在命名空间中添加一个符号,但您可以从中引用导出的对象:

# simple import
import abc

abc.ABC
abc.ABCMeta

# renamed via "as"
import abc as module
module.ABC
module.ABCMeta

当 you 时import *,您将该模块中的所有导出符号添加到当前命名空间中,因此您可以直接引用它们而无需模块前缀:

#### YOU PROBABLY SHOULD NOT DO THIS
from abc import *
####

ABC
ABCMeta

如果你在 shell 或 notebook 中进行黑客攻击;没有大碍。但是生产代码不应该这样做。


推荐阅读