2016-01-17 6 views
2

У меня есть модуль, который может быть описан как питонаPython, разбить модуль на несколько файлов

class Symbol(): 
    def __init__(data): 
     self.data = data 
     pass 
    def __add__(self,other): 
     return Add(self,other) 

class Integer(Symbol): 
    pass 

class Add(Symbol): 
    def __init__(a,b): 
     self.data = [a,b] 

Я хочу, чтобы разделить его на три файла, которые symbol.py, integer.py и добавить. ру; конечно, будет намного больше информации об этих классах, поэтому иметь их в одном файле смешно.

По какой-то причине импорт никогда не работает, хотя он даже не жалуется на круговые зависимости, может ли кто-нибудь дать мне небольшой пример?

+0

Вы использовали 'from add import Add'? (Предполагая, что вы создали add.py) – Oisin

+0

Я пробовал как относительный, так и абсолютный импорт, ни один из них, похоже, не работал для меня, так как я много пробовал, количество трассбеков сумасшедшим, мне просто нужен какой-то рабочий пример для построен на. – Onza

+1

Похоже, вы превратили свой модуль в пакет. Вы поместили его в подходящий подкаталог? Что еще более важно, убедитесь, что в этом подкаталоге есть файл '__init __. Py'. – Evert

ответ

1

Ваша круговая зависимость не является неразрешимой, поскольку Symbol не зависит от Add во время определения, только когда вызывается метод __add__. Существует два хороших способа решения проблемы.

Первый заключается в отсутствии модуля Symbol в импорте Add на верхнем уровне, но только в этом методе __add__. Например, если ваши модули были названы в честь классов (только в нижнем регистре), вы бы использовать это в symbol.py:

class Symbol(): 
    # ... 

    def __add__(self,other): 
     from add import Add 
     return Add(self,other) 

Другой подход импортировать Add глобально в symbol модуль, но сделать это после определение класса Symbol. Таким образом, когда модуль add импортирует symbol назад, он всегда сможет увидеть определение класса Symbol, даже если остальная часть модуля не будет загружена.

class Symbol(): 
    # same as in your current code 

from add import Add 

Если вы идете с этим вторым подходом и Symbol импорта класса другие вещи в верхней части файла (где import заявления обычно ставятся), вы можете добавить комментарий в этом пространстве о Add импортируемого позже (и почему).

+0

спасибо, я удивлен, что вы могли бы сделать все это, если бы я не смог сделать правильное определение из-за моей чрезвычайной ситуации. – Onza

+0

У меня также есть quesiton, не первый подход заставит мой код загружать 'from add import Add' несколько раз? заставляя его быть медленным? – Onza

+0

Линия 'from add import Add' будет работать многократно, но она будет быстрой, так как модуль' add' будет кэширован после первого импорта. Второй и весь последующий импорт нужно будет искать только в 'sys.modules', а не загружать его снова. – Blckknght

Смежные вопросы