分层蟒蛇进口
问题描述:
所以我有两个模块A和B,另一个安装模块C.说我在A和B中使用C的一些方法。我还需要B中的模块A.因此,从逻辑上来说,我的进口是:分层蟒蛇进口
答:
import C
B:
import A
逻辑会告诉我,B将包含从A和C.然而,这并不工作职能这种方式默认。在此指的是任何功能下,在模块A的意义上,我们需要的命名空间引用额外水平
A.C.some_c_module()
我发现,我们可以同时在一个导入C和B在不使用的讨厌的“C像“ifdef克隆”这样的语言,它会正常工作。我的问题是,两次输入这样的模块是否会受到惩罚?从某种意义上来说,python足够聪明地知道A.C.some_module == C.some_module?还是我这样做只是一个坏男孩?
答
导入模块两次不会导致它被加载两次。 Python加载模块一次并保存对它的引用。所以是的,Python很聪明,知道这两个版本是一样的。您可以尽可能多地导入模块,它只会“花费”一次。
顺便说一句,“B将包含来自A和C的函数”的原因是错误的是,当您在A.py中执行import C
时,A
不包含“来自C的函数”。而是,A包含对C本身的引用。所以当你从B里面导入A时,你会得到对C的引用,而不是对C内部函数的引用。如果你使用from C import blahBlah
将C的各个部分直接导入到A的命名空间中,那么当你导入A时,你将有权访问这些功能为A的成员。
# A.py
from C import blah
# B.py
import A
A.blah # this will work
您可以使用'is'运算符来验证这一点。在这种情况下,'C是A.C'将是真的 – 2012-07-15 19:47:11
很酷..所以我想所有的python都有参考模块,而不是实际上“导入”的传统意义上?谢谢! – Laz 2012-07-16 16:04:10