Об импорте модулей в Python - PullRequest
0 голосов
/ 08 июля 2011

У меня три модуля в одной папке.

Первый модуль, run.py, является главной программой.

Второй модуль, называемый shape.py, содержит класс с именем"Shape"

Третий модуль, называемый circle.py, содержит класс с именем "Circle", который наследуется от Shape.

Код записывается следующим образом:

run.py

from shapes import Shape
from circles import Circle

a = Circle()
a.print_test()

shape.py

class Shape(object):

    def print_name(self):

        print "I am a generic shape"

circle.py

class Circle(Shape):

    def print_name(self):

        print "I am a circle"

Я хочу иметь возможность запустить программу и заставить консоль сказать "Я круг », но он вызывает исключение при импорте кругов, говорящих, что« форма не определена ».

Я всегда могу сказать circle.py импортировать класс Shape, но это не то, что мне нужно.Что если они не в одной папке?Что делать, если существует сложная иерархия папок?

Такое ощущение, что я импортирую модуль фигур дважды таким образом, чтобы я мог импортировать круги.

Что я могу сделать?(ну, в этом случае, run.py, вероятно, даже не нужно импортировать Shape, но если бы у меня были другие модули "треугольники", "шестиугольники" и "пятиугольники", я не хочу, чтобы их все приходилось импортироватьФорма)

РЕДАКТИРОВАТЬ: Я мог бы просто поместить их все в один модуль, потому что они формы!Но такого рода проблемы могут возникнуть со временем.

Ответы [ 3 ]

3 голосов
/ 08 июля 2011

Вам необходимо импортировать все классы, которые вы используете в модуле Python. В вашем первом модуле (run.py) вы не используете Shape, только Circle, поэтому вы можете опустить его там. run.py не нужно знать, как вообще определены Circle s.

Однако в circles.py вам необходимо импортировать shapes, так как вы основываете свой класс Circle на классе Shape, поэтому он должен иметь доступ к определению там.

from shapes import Shape

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

Я бы порекомендовал вам использовать такой инструмент, как pyflakes , чтобы проверить ваши файлы на наличие ошибок, подобных этим. Вы можете подключить такой скрипт к различным редакторам для автоматического запуска, предоставляя мгновенную обратную связь при каждом сохранении файлов python.

3 голосов
/ 08 июля 2011

Импорт shapes изнутри circles.py:

from shapes import Shape

class Circle(Shape):
   ...

В Python каждый модуль должен import все, что ему нужно.Он не может полагаться на какой-либо другой модуль для его импорта.

0 голосов
/ 08 июля 2011

Я думаю, вам нужно инициализировать суперкласс фигур в классе круга.Вы можете сделать это с помощью конструкторов.Таким образом, в вашем классе circle.py вам понадобится что-то вроде следующего:

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

Книга Магнуса Ли Хетланда "Начинающий Питон: от новичка до профессионала" охватывает эту область довольно хорошо.

...