【问题标题】:About importing modules in python关于在python中导入模块
【发布时间】:2011-07-07 20:02:28
【问题描述】:

我在同一个文件夹中有三个模块。

第一个模块,run.py,是主程序。

第二个模块,称为shapes.py,包含一个名为“Shape”的类

第三个模块,称为 circles.py,包含一个名为“Circle”的类,该类继承自 Shape。

代码编写如下

运行.py

从形状导入形状 从圈子导入圈子 a = 圆() a.print_test()

shapes.py

类形状(对象): def print_name(self): 打印“我是一个通用形状”

circles.py

类圆(形状): def print_name(self): 打印“我是一个圆圈”

我希望能够运行程序并让控制台说“我是一个圆圈”,但是在导入圆圈时会抛出一个异常,说“形状未定义”。

我总是可以告诉 circles.py 导入 Shape 类,但这不是我想要的。如果它们不在同一个文件夹中怎么办?如果文件夹层次结构复杂怎么办?

感觉就像我以这种方式不必要地导入了两次形状模块,只是为了导入圆圈。

我能做什么? (好吧,在这种情况下,run.py 可能甚至不需要导入 Shape,但如果我有一些其他模块“三角形”、“六边形”和“五边形”,我不希望它们都必须导入形状)

编辑:我也可以将它们全部放在同一个模块中,因为它们是形状!但这种问题可能会在一段时间内出现。

【问题讨论】:

  • “我总是可以告诉 circles.py 导入 Shape 类,但这不是我想要的。”那么 Python 不适合你。
  • 我的设计最终会有“三角形”和“六边形”以及许多其他形状,它们都将继承 Shape。但随后我可能会将shapes.py 移动到另一个文件夹,这意味着我必须去更改所有的导入语句。我想避免进行此类更改。
  • @Keikoku: 如果Circle 应该是Shape,那么它必须知道Shape 是什么——否则,它应该如何继承它?!
  • @katrielalex,想法是让 run.py 导入它,这样圆圈就不必导入它,因为我可以有三角形和六边形,但这种方法可能行不通还有另一种方法。
  • @Keikoku:但run.py 知道Shape 是什么并不意味着circles.py 知道Shape 是什么。这就是 Python 的工作原理。

标签: python python-import


【解决方案1】:

circles.py 中导入shapes

from shapes import Shape

class Circle(Shape):
   ...

在 Python 中,每个模块都必须 import 满足它的需要。它不能依赖任何其他模块来为它进行导入。

【讨论】:

  • @katrielalex:一开始我把它们倒过来了。我认为它现在已修复。
  • @Greg:他们仍然落后,为你修好了。
【解决方案2】:

您需要导入您在 python 模块中使用的所有类。在您的第一个模块 (run.py) 中,您没有使用 Shape,仅使用 Circle,因此您可以在此处省略它。 run.py 根本不需要知道 Circles 是如何定义的。

然而,在circles.py 中,您确实需要导入shapes,因为您的Circle 类基于Shape 类,因此它需要能够访问那里的定义。

from shapes import Shape

class Circle(Shape):
    def print_name(self):
         print "I am a circle"

我建议您使用pyflakes 之类的工具来检查您的文件中是否存在此类错误。您可以将此类脚本与各种编辑器挂钩以自动运行,从而在您保存 Python 文件时立即提供反馈。

【讨论】:

  • @Martijn Pieters,所以基本上即使我在 run.py 中导入了 Shape,circle.py 也不知道 Shape?
  • 没错。 run.py 是一个独立于 circle.py 的模块。每个模块只知道它定义或导入的名称。 circle.py 没有什么神奇之处可以让它知道 run.py 导入了什么。
【解决方案3】:

我认为你必须在圆形类中初始化形状超类。您可以通过构造函数来做到这一点。因此,在您的 circle.py 类中,您需要具有以下内容:

class Circle(Shapes):
    def __init__(self):
        Shapes.__init__(self)
        # put the rest of your circle code here.

Magnus Lie Hetland 的书《Python 入门:从新手到专业人士》很好地涵盖了这一领域。

【讨论】:

    猜你喜欢
    • 2018-10-02
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多