Rei*_*ica 1 python model-view-controller
我正在使用 Python 开发一个项目,并且尝试遵循某种严格的 MVC 模式进行实践。我的想法是将东西分成名为model,view和的包controller,并且每个包都有一个Model,View和Controller类。每个包都会有每个部分的支持文件。
我的问题是我希望能够像这样使用它们:
from controller import Controller
Run Code Online (Sandbox Code Playgroud)
然后在带有 Controller 类的文件中我可以:
from controller.someclass import SomeClass
Run Code Online (Sandbox Code Playgroud)
但如果我将它们放在同名的包中,就会遇到问题。我阅读了有关模块如何工作的信息,并意识到我需要将它们命名为controller/__init__.py、model/__init__.py和view/__init__.py,但将它们放入该文件中似乎很奇怪,而且它们都在 gedit 中显示为__init__.py
有更好的方法吗?我以正确的方式处理这件事吗?
我在 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),然后导入您的类。(模型(对象))