Вызов из родительского файла в Python - PullRequest
3 голосов
/ 31 декабря 2008

У меня есть файл с именем main.py и файл classes.py

main.py содержит приложение и то, что происходит, в то время как class.py содержит некоторые классы.

main.py имеет следующий код

main.py

import classes

def addItem(text):
    print text

myClass = classes.ExampleClass()

И тогда у нас есть classes.py

classes.py

class ExampleClass (object):
    def __init__(self):
        addItem('bob')

Удивительно, но это не тот код, который я использую, потому что я вычеркнул все, что мешало бы вам увидеть то, что я хочу сделать. Я хочу иметь возможность вызывать метод, который определен в main.py из класса в classes.py. Как мне это сделать?

Заранее спасибо

Ответы [ 4 ]

9 голосов
/ 31 декабря 2008

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

Если у вас есть два модуля A и B, которые зависят друг от друга, самый простой способ - выделить часть кода, от которой они оба зависят, в третий модуль C, и оба они импортируют C.

3 голосов
/ 31 декабря 2008

Предложения по рефакторингу хорошие. Если вам нужно оставить файлы такими, как есть, то вы можете отредактировать файл main.py, чтобы убедиться, что ничего не выполняется, просто импортировав файл, а затем импортировать main в нужную функцию:

class ExampleClass (object):
    def __init__(self):
        import main
        main.addItem('bob')

Это позволяет избежать циклического импорта, но не так хорошо, как рефакторинг с самого начала ...

1 голос
/ 31 декабря 2008

Весь ваш исполняемый код должен быть внутри if __name__ == "__main__". Это предотвратит его выполнение при импорте в виде модуля. В main.py

if __name__=="__main__":
    myClass = classes.ExampleClass()

Однако, как заявляет dF, вероятно, на этом этапе лучше провести рефакторинг, чем пытаться разрешить циклические зависимости.

1 голос
/ 31 декабря 2008

Я бы предложил поместить общие функции либо в classes.py, либо, возможно, даже лучше, в третий модуль, возможно, utils.py.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...