Python设计问题

时间:2010-02-10 05:03:35

标签: python json oop

我是一名C程序员,我对Python的态度非常好。但是我仍然有一些问题让我开始思考Python的OO真棒。

这是我目前的设计问题:

结束“产品”是一个用Python创建的JSON数据结构(并传递给Javascript代码),包含不同类型的数据,如:

{ type:url, {urlpayloaddict) }
{ type:text, {textpayloaddict}
...

我的Javascript知道如何解析和显示每种类型的JSON响应。

我很满意这个设计。我的问题来自于在Python代码中处理这些数据。

我从各种来源获取数据:MySQL,表查找,对Web服务的API调用...... 基本上,我应该创建一个超类 responseElement 并为每种类型的响应专门化它,然后在Python代码中传递这些对象的列表或者我应该简单地传递一个包含该类型的字典列表键值对中的响应数据。答案似乎导致了不同的实现。

我有点不确定我是否也对象高兴 ??

5 个答案:

答案 0 :(得分:5)

在我看来,它基本上是这样的:你应该尝试在 相同的地方保持相同的东西,并将它们分开在不同的地方。

如果你在数据上执行完全相同的操作,并且它们都可以用通用格式表示,那么没有理由为它设置单独的对象 - 尽快将其转换为通用格式t在实现无法区分的事情时重复自己。

如果每种类型/数据源都需要特定于它的特定操作,并且在Python代码处理的层之间没有太多重叠,那么将事物保存在单独的对象中以便维护专业代码与其能够运行的特定数据之间的紧密关联。

答案 1 :(得分:3)

不同的响应源是否代表根本上不同的类别或对象的?它们看起来并不像你描述的那样。

因此,各种编码/解码功能和仅传递一种类型似乎是最佳解决方案。

如果您对数据使用特殊方法(但那些方法不关心输入和输出编码是什么),那么该类型可以是dict或您自己的类,或者您可以将编码/解码对放入班级。 (Decode将是一个classmethod,返回一个新实例。)

答案 2 :(得分:2)

您的接收器对象(可能完全是不同类的实例,可能由工厂模式根据传入数据的来源生成)应该都有一个返回相应dict(或其他直接-JSON'able)的通用方法结构,例如将变成JSON数组的列表。)

与一个答案所说的不同,这种方法显然需要更高级别的代码才能知道它正在处理的接收器的确切类型(多态将在 any <处理< / em> OO语言!) - 更高级别的代码也不需要知道“键的名称”(再次,其他答案特别指出),因为它可以很好地将“JSON”数据视为非常不透明的数据令牌(只要它适合作为json.dumps以后调用的参数!)。

构建并传递“普通旧数据”对象的容器(以各种方式生成并添加到容器中)以进行最终序列化(或其他此类统一处理,但您可以将JSON转换视为特定的序列化形式)是一种常见的OO模式。毕竟,不需要随身携带比这些POD数据更丰富或更重的东西,并且在Python中使用dict作为POD通常是一种非常自然的实现选择。

答案 3 :(得分:1)

我在OOP方法上取得了成功。考虑一个带有“ToJson”方法的基类,让每个子类适当地实现它。然后你的更高级代码不需要知道有关如何获取数据的任何细节......它只知道它必须在你提到的列表中的每个对象上调用“ToJson”。

字典也可以工作,但它需要你的调用代码知道密钥的名称等,并且也不会扩展。

OOP我说!

答案 4 :(得分:1)

就个人而言,无论何时何地,我都会选择后者(传递数据列表)。我认为OO经常被误用/滥用于某些事情。我特别避免将数据包装在对象中,只是为了将它包装在对象中。所以,{'type':'url', 'data':{some_other_dict}}比我更好:

class DataObject:
    def __init__(self):
        self.type = 'url'
        self.data = {some_other_dict}

但是,如果你需要为这些数据添加特定的功能,比如它能够对data.keys()进行排序并将它们作为一组返回,那么创建一个对象会更有意义。