2011-01-31 3 views
1

Я работаю над проектом на Python, и я стараюсь придерживаться несколько строгой модели MVC для практики. Моя идея состояла в том, чтобы разделить вещи на пакеты с именами model, view и controller, плюс есть классы Model, View и Controller для каждого. Каждый пакет будет иметь поддерживающие файлы для каждой части.Разбиение классов MVC в Python

Моя проблема заключается в том, что я хочу, чтобы иметь возможность использовать их люблю:

from controller import Controller 

, а затем в файле с классом контроллера я могу:

from controller.someclass import SomeClass 

Но если я ставлю их в пакеты с тем же именем, я получаю проблемы. Я дочитал о том, как работают модули, и понял, что мне нужно, чтобы назвать их controller/__init__.py, model/__init__.py и view/__init__.py, но это кажется странным, чтобы поместить их в этот файл, и это отчасти раздражает, что все они появляются Gedit как __init__.py

Есть ли лучший способ сделать это? Правильно ли я это делаю?

+0

Я думаю, что вам не хватает точек модулей python. Вам нужны занятия? Почему у вас нет логики в вашем пакете контроллера, поэтому вы можете просто «импортировать контроллер», а затем «controller.whatever()» – Falmarri

+0

Проблема будет такой же, если бы я делал это именно так. Я все равно собирал логику в файлах с именем '__init __. Py'. –

+0

Да, вот как работает python. – Falmarri

ответ

4

Я видел черную магию в источнике django, который вытягивает классы из файла base.py в пространство имен __init__.py. Однако я не уверен, как это делается. (См. Комментарии для того, как это сделать.)

Из того, что я знаю, вы можете сделать одну из двух вещей.

A - внутри bar/controller/__init__.py

import os,sys 
# Make sure the interpreter knows were your files are. 
sys.path.append(os.path.join(os.path.dirname(__file__),'../') 
from bar.controller import Controller 
from bar.model import Model 
from bar.view import View 
class Controller(object): 
model = Model() 
view = View() 

И теперь вы делаете bar/model/__init__.py и bar/view/__init__.py

B - внутри bar/controller/__init__.py

class Model(object): 
pass 
class View(object): 
pass 
class Controller(object): 
model = Model() 
view = View() 

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

bar/ 
    __init__.py 
    controller.py 
    model.py 
    view.py 

Тогда внутри controller.py

import os,sys 
from bar.controller import Controller 
from bar.model import Model 
from bar.view import View 
class Controller(object): 
model = Model() 
view = View() 

Это было огромное препятствие для меня, чтобы приходить от Явы. Имена классов вашего класса не должны совпадать с именем класса. Подумайте о них как о шаге, вы входите в папку (модуль), а затем в файл (.py), а затем импортируете свой класс. (Модель (объект))

+1

«Черная магия» - это нечто вроде «из базового импорта» в '__init__.py 'файл. +1 для разумного объяснения. – sdolan

+1

Будьте осторожны с циклическим импортом здесь – Falmarri

+0

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

2

Если я правильно понимаю, все, что вы заинтересован в этом здесь оказывает это произошло:

from controller import Controller 

, не имея Controller класс, определенный в controller/__init__.py правильно?

Если это так, то просто это сделать:

В controller/base.py: (уведомление есть файл с именем base.py или что-то другое)

class Controller(BaseClass): 
    # define Controller here 

В controller/__init__.py:

from base import Controller 

Теперь вы может иметь точный синтаксис, который вы ищете.