【问题标题】:Import convention with inheritance带继承的导入约定
【发布时间】:2015-08-07 03:55:50
【问题描述】:

我有一个目录结构:

/somedir
    /x
        A.py
        B.py
/anotherdir
    /y
        C.py

B 导入 A。这在我从somedir/x/ 运行B.py 时有效。但是,在C.py 尝试导入B.py 然后运行

$> python C.py

它抱怨找不到A。我可以将somedir/x/ 添加到pythonpath 中,这样当我运行C.py 时,它可以找到BA。但是,我担心我使用的不同目录中是否会有另一个 A (diffdir/z/A),它可能与包含 somedir/x/A 的 pythonpath 冲突。

【问题讨论】:

  • 您能否更清楚地了解目录结构的外观? C 完全在不同的目录中吗?
  • 没错,C在一个完全不同的目录中。
  • 你能展示一下B是如何在C中导入的代码吗?

标签: python oop python-3.x python-import


【解决方案1】:

我猜您遇到的基本问题是因为在 Python 2.x 和 Python 3.x 之间更改为 intra-package references。来自documentation -

6.4.2。包内引用

当包被构造成子包时(如示例中的声音包),您可以使用绝对导入来引用兄弟包的子模块。比如sound.filters.vocoder模块需要使用sound.effects包中的echo模块,可以使用fromsound.effects import echo

基本上,如果您要导入 BB 导入同级,在 Python 3.x 中,您需要使用绝对路径在 B 中导入 A。根据您所说,您将B 导入为-

import somedir.x.B

然后在 B 中,您需要将 A 导入为 -

import somedir.x.A

或者你也可以试试-

from . import A

【讨论】:

  • 谢谢,我认为 B 必须知道其父目录的结构似乎有点令人困惑。通常,B 应该能够在不知道其父母的情况下找到其所有直接邻居。也许从 . import A 将在 B 中工作。
  • 其实不然,你看到当你必须将 B 导入为 somedir.x.B 时,它表明 B 所在的框架/应用程序从 somedir 开始。因此,如果B 想要访问其中的任何内容,则需要使用相同的包结构。
猜你喜欢
  • 2016-05-12
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2018-07-21
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
相关资源
最近更新 更多