3

所以我有两个模块 A 和 B,以及另一个安装的模块 C。假设我在 A 和 B 中使用了 C 的一些方法。我还需要 B 中的模块 A。所以从逻辑上讲,我的导入将是:

A :

import C

乙:

import A

逻辑会告诉我 B 将包含来自 A 和 C 的函数。但是默认情况下这不起作用。从某种意义上说,要在模块 A 中引用 C 中的任何函数,我们需要额外级别的命名空间引用

A.C.some_c_module()

我发现我们可以在 A 和 B 中导入 C,而无需使用讨厌的“C 语言之类”ifdef 克隆,并且可以正常工作。我的问题是,两次导入此类模块是否会受到惩罚?从某种意义上说,python 足够聪明,可以知道 ACsome_module == C.some_module?还是我这样做只是一个坏孩子?

4

1 回答 1

3

两次导入一个模块不会导致它被加载两次。Python 会加载一次模块并保留对它的引用。所以是的,Python 足够聪明,知道这两个版本是相同的。您可以根据需要尽可能多地导入模块,而且它只会“花费”您一次。

顺便说一句,“B 将包含来自 A 和 C 的函数”的原因是错误的,因为当您import C在 A.py 中执行时,A它不会“包含来自 C 的函数”。相反,A 包含对 C 本身的引用。因此,当您从 B 内部导入 A 时,您将获得对 C 的引用,而不是对 C 内部函数的引用。如果您通过 using 将 C 的各个部分直接导入 A 的命名空间from C import blahBlah,那么当您导入 A 时,您将可以访问这些函数作为A的成员。

# A.py
from C import blah

# B.py
import A
A.blah # this will work
于 2012-07-15T18:43:45.073 回答