关于在python中导入模块

2024-04-24 05:27:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

第一个模块,运行.py,是主程序。在

第二个模块,叫做形状.py,包含一个名为“Shape”的类

第三个模块,叫做圆圈.py,它包含一个名为“Circle”的类,该类继承自Shape。在

代码编写如下

在运行.py在

from shapes import Shape
from circles import Circle

a = Circle()
a.print_test()

在形状.py在

^{pr2}$

在圆圈.py在

class Circle(Shape):

    def print_name(self):

        print "I am a circle"

我希望能够运行程序,并让控制台说“我是一个圆”,但它抛出了一个例外,当导入圆圈说“形状未定义”。在

我总能看出圆圈.py导入Shape类,但这不是我想要的。如果它们不在同一个文件夹里呢?如果有复杂的文件夹怎么办?在

这感觉就像我导入了两次图形模块,不必要的只是为了导入圆。在

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

编辑:我也可以把它们放在同一个模块里,因为它们都是形状!但这种问题迟早会出现的。在


Tags: 模块代码frompytestimport文件夹形状
3条回答

circles.py内导入shapes

from shapes import Shape

class Circle(Shape):
   ...

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

您需要导入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"

我建议您使用pyflakes这样的工具来检查文件中是否存在以下错误。您可以将这样一个脚本与自动运行的各种编辑器连接起来,在保存python文件时提供即时反馈。在

我想你必须初始化circle类中的shapes超类。您可以通过构造函数来实现这一点。所以在你的圆.py类您需要以下内容:

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

马格努斯·利赫特兰的书《开始Python:从新手到专业人士》很好地涵盖了这一领域。在

相关问题 更多 >