【问题标题】:In Python, why can't I do: import A; A.B.C.foo()在 Python 中,为什么我不能这样做: import A; A.B.C.foo()
【发布时间】:2023-03-27 21:00:01
【问题描述】:

换句话说,要使用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" 的信息。

【问题讨论】:

  • B是文件夹吗,有__init__.py文件吗?
  • 可以做你想做的事 - 如果模块作者以允许的方式构建他们的代码。

标签: python python-import


【解决方案1】:

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

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

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

严格来说,模块中对名称的引用是属性 参考:在表达式 modname.funcname 中,modname 是一个模块 object 和 funcname 是它的一个属性。在这种情况下会发生 是模块属性和 模块中定义的全局名称:它们共享相同的命名空间!

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

from A import B.C
B.C.foo()

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多