在 Python 中布置 MVC 类

Rei*_*ica 1 python model-view-controller

我正在使用 Python 开发一个项目,并且尝试遵循某种严格的 MVC 模式进行实践。我的想法是将东西分成名为model,view和的包controller,并且每个包都有一个Model,ViewController类。每个包都会有每个部分的支持文件。

我的问题是我希望能够像这样使用它们:

from controller import Controller
Run Code Online (Sandbox Code Playgroud)

然后在带有 Controller 类的文件中我可以:

from controller.someclass import SomeClass
Run Code Online (Sandbox Code Playgroud)

但如果我将它们放在同名的包中,就会遇到问题。我阅读了有关模块如何工作的信息,并意识到我需要将它们命名为controller/__init__.pymodel/__init__.pyview/__init__.py,但将它们放入该文件中似乎很奇怪,而且它们都在 gedit 中显示为__init__.py

有更好的方法吗?我以正确的方式处理这件事吗?

jbc*_*tin 6

我在 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()
Run Code Online (Sandbox Code Playgroud)

现在你做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()
Run Code Online (Sandbox Code Playgroud)

编辑:...阅读您的评论后,我想到了第三个选项。Python 中的包并不能直接翻译成模块。我认为您想要的结果是创建这样的目录结构:

bar/
  __init__.py
  controller.py
  model.py
  view.py
Run Code Online (Sandbox Code Playgroud)

然后里面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()
Run Code Online (Sandbox Code Playgroud)

这对我从java转行来说是一个巨大的障碍。您的类文件名不必与类名匹配。将它们视为一个步骤,您进入文件夹(模块),然后进入文件(.py),然后导入您的类。(模型(对象))