Python:如何实现MVC?是否太复杂了?真的可行吗?

0 投票
1 回答
784 浏览
提问于 2025-04-17 19:04

在一个桌面应用程序中,我正在开发一个关于城市的模型。

class City(object):

    def __init__(self, name, population):
        self._name = name
        self._population = population

我想实现一个编辑方法,用来修改它的私有属性。我的想法是打开一个窗口,里面有文本输入框,用户可以在这里输入新的值。为了让这个功能更容易测试,并且不互相影响,我是这样做的:

# Within City class
def edit(self, get_properties_function=None):
    """
    Edit properties. Don't pass get_properties_function except for testing
    """

    if get_properties_function is None:
        get_properties_function = self._get_city_properties

    new_name, new_population = get_new_properties()

    self._name = new_name
    self._population = new_population

def _get_city_properties(self):

    # launch GUI and get the new values

    return new_name, new_population

现在有几个问题:

  • 那个询问信息的对话框,是不是可以算作一个视图?这让我想到下一个问题。
  • 如果我有了视图,我觉得应该进一步考虑实现一个控制器。那么,在这里如何实现MVC模式呢?

我的想法是有三个类(模型-视图-控制器),每次我实例化我的“城市概念”时,也同时实例化模型、视图和控制器。控制器就成了“城市”的公共接口。这听起来有点过于复杂了。

我觉得我可能对真正的MVC模式有些误解,可能是因为我之前接触的都是网页编程。

1 个回答

-1

----- 更新 ----
正如tereško所说,控制器并不是从模型中读取数据。关于这种关系,可以参考维基百科的解释 http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

----- 原文 ---
你的 class City 是模型,而对话框是视图,那么控制器是什么呢?

我觉得你需要另一个类来处理“模型编辑”。

所有对话框的数据都是由控制器提供的,和 class City 保持距离。

我试着用数据流来描述我的想法。

启动时,显示窗口(对话框?)
视图 -> (获取数据) 控制器 -> (读取属性) 模型
视图 <- 控制器 <- 模型 (返回数据)

你想修改数据
视图 -> (发送修改后的数据到) 控制器 -> (更新模型数据) -> 模型
视图 <- 控制器 <- 模型 (你的对话框显示更新后的内容)

撰写回答