Как разбить модуль Python на несколько файлов? - PullRequest
16 голосов
/ 18 октября 2011

У меня есть один модуль Python, который содержит 3 класса: A, A1 и A2.A1 и A2 являются производными от A. A содержит функции, которые работают с A1 и A2.

Все это прекрасно работает, когда оно находится в одном файле .py.Но этот файл вырос довольно долго, и я хотел бы разделить А1 и А2 на их собственные файлы.Как я могу разбить этот файл, несмотря на круговую зависимость?

Ответы [ 3 ]

11 голосов
/ 18 октября 2011

modA.py:

class A(...):
   ...

modA1.py:

import modA
class A1(modA.A):
   ...

modA2.py:

import modA
class A2(modA.A):
   ...

modfull:

from modA import A
from modA1 import A1
from modA2 import A2

Даже если A «обрабатывает» A1 и A2, с вами все будет в порядке, потому что благодаря вводу утки вам не нужно импортировать реальные имена.

2 голосов
/ 18 октября 2011

Как разделить этот файл, несмотря на циклическую зависимость?

Вариант 1: разорвать циклы: поместить базовый класс в его собственный модуль, производные классы в дополнительные модули,и функции, работающие с этими производными классами в еще одном модуле.


Вариант 2: игнорировать циклы, импортировать только модули / пакеты в глобальное пространство имен, IE:

foo.py

class Bar:
    "Frobs Quuxen"

Никогда не следует импортировать как from foo import Bar, просто используйте import foo и обращайтесь к foo.Bar в необходимых функциях.

0 голосов
/ 18 октября 2011

Я думаю, что суть вашего вопроса в том, что вы не хотите

a.py to imports a1
if
a1.py imports a.

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

...