我在同一个文件夹中有三个模块。
第一个模块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,但如果我有一些其他模块“三角形”,“六边形”和“五边形”我不希望它们都必须导入形状)
编辑:我也可以将它们全部放在同一模块中,因为它们是形状!但是这种问题可能会在一段时间内出现。答案 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:从新手到专业”相当不错地涵盖了这个领域。