关于在python中导入模块

时间:2011-07-07 20:02:28

标签: python python-import

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

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

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

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

代码编写如下

run.py

from shapes import Shape
from circles import Circle

a = Circle()
a.print_test()

shapes.py

class Shape(object):

    def print_name(self):

        print "I am a generic shape"

circles.py

class Circle(Shape):

    def print_name(self):

        print "I am a circle"

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

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

感觉就像我不必要地导入形状模块两次,以便我可以导入圆圈。

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

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

3 个答案:

答案 0 :(得分:3)

shapes

中导入circles.py
from shapes import Shape

class Circle(Shape):
   ...

在Python中,每个模块必须import无论需要什么。它不能依赖任何其他模块来进行导入。

答案 1 :(得分:3)

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

但是,在circles.py中,您需要导入shapes,因为您的Circle课程基于Shape课程,所以它需要有权访问from shapes import Shape class Circle(Shape): def print_name(self): print "I am a circle" 定义那里。

{{1}}

我建议您使用像pyflakes这样的工具来检查文件是否存在这些错误。您可以将这样的脚本与各种编辑器挂钩以自动运行,每当您保存python文件时都会立即给出反馈。

答案 2 :(得分:0)

我认为你必须在circle类中初始化形状超类。你可以通过构造函数来做到这一点。所以在你的circle.py类中你需要有类似下面的东西:

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

Magnus Lie Hetland的书“开始Python:从新手到专业”相当不错地涵盖了这个领域。