1

换句话说,要使用foo我需要导入所有内容,foo例如:

from A.B.C import foo

或最多

from A.B import C
C.foo()

但我不能这样做:

from A import B
B.C.foo()

这给了我类似的东西'module' object has no attribute "C"

4

1 回答 1

4

文档解释了原因:http ://docs.python.org/tutorial/modules.html

每个模块都有自己的私有符号表,它被模块中定义的所有函数用作全局符号表。因此,模块的作者可以在模块中使用全局变量,而不必担心与用户的全局变量发生意外冲突。另一方面,如果您知道自己在做什么,则可以使用与引用其函数时相同的符号 modname.itemname 来触摸模块的全局变量。

http://docs.python.org/tutorial/classes.html#python-scopes-and-namespaces

严格来说,模块中对名称的引用是属性引用:在表达式 modname.funcname 中,modname 是一个模块对象,funcname 是它的一个属性。在这种情况下,模块的属性和模块中定义的全局名称之间恰好有一个直接的映射:它们共享相同的命名空间!

所以简单地说 BC 没有被导入,并且在上一个示例中不知道。但这会起作用:

from A import B.C
B.C.foo()
于 2012-06-13T22:32:30.030 回答