如果我到处处理字典,我应该把它们作为“课程”吗?

时间:2011-07-16 21:44:31

标签: python oop

现在,我有很多python文件。每个都有很多功能。

我在各处传递哈希地图。基本词典,以词为键,分数为值。

{ 'dog': 33, 'cat': 294 }

我也在做一些更复杂的结构,比如:

{ 'dog': [ 33, 66, 11, 88 ], 'cat': [11, 66, 22] }

我需要将这些变成我自己的“对象”吗?如果是这样,他们会是什么? 我不太喜欢OOP,所以我问这些菜鸟问题。

6 个答案:

答案 0 :(得分:4)

多年来一直保持一个很大的代码库,支持对象的原始dicts,我的观点是,如果这个代码库由A)另一个人或B)几个人维护,你应该开始迁移到真正的类和OOP。首先,您可以通过查看源代码或使用dir()和其他内省技术以交互方式轻松查看类实例应具有的属性,从而使您的代码更易于学习,修改和维护。对于具有直观名称,定义良好的属性,文档和可读源代码的类而言,理解和调试变得更加容易,而不是以将dicts作为参数的大量函数,并在运行时以无数种方式转换它们只有通过阅读整个代码库才能理解。当涉及到classe时,回溯通常也更容易阅读和解密,因为您没有获得通用的低级错误消息。

作为进一步的证据,去看看成熟和成功的python项目。你会看到很多OOP,类和文档。原始的dicts,列表,集合和元组在适当的时候(您的数据非常简单)以及小型项目和脚本都很棒,但可维护性不会超过某个项目大小。 “X只是一个字典”的概念只有在你的X概念非常简单的情况下才能存活下来。

答案 1 :(得分:3)

根据您的具体操作,namedTuple可能是您问题的最佳解决方案。没有足够的信息可以肯定地说。

答案 2 :(得分:3)

我的经验法则是,如果你有作用于字典的函数,那么它应该是一个类,那些函数应该是方法。

作为一个(主要是前任)-perl程序员,通过上述风格是非常熟悉的。但是,Python OO工具的重量要轻得多,值得早点而不是以后部署。

例如

{ 'dog': 33, 'cat': 294 }

变得类似

class AnimalCount(object):
    """Some useful documentation you didn't have a place for before"""
    def __init__(self, dog=0, cat=0):
        self.dog = dog
        self.cat = cat
    def add_cat(self):
        self.cat += 1
    def add_dog(self):
        self.dog += 1
    def dog_eats_cat(self):
        self.cat -= 1

答案 3 :(得分:1)

OOP(或任何其他设计理念)是一种简化代码的策略,而不是您遵循的宗教,因为它在Google上有很多点击。

OOP的目标是分解代码中的重复模式:如果您经常编写相同的代码来处理这些代码,则应该将这些模式考虑在内并编写函数。有时你会有许多这些函数,在相同的数据结构上运行,然后你将它们组合在一个类上。

那么,你应该上课吗?只有您认为它可以简化您的代码。

答案 4 :(得分:0)

dicts适用于许多用途。当你发现需要添加一些属性时,只需子类化dict。

答案 5 :(得分:0)

使用字典是面向对象的,因为字典是一个类,而您的实例是一个对象。使用您自己的类扩展它的原因不应该仅仅是因为您想编写OO,应该是因为字典类需要添加其他方法或属性。

我们无法在没有更详细的情况下回答这个问题。

您还可以嵌套词典,因此键是一个字符串,值是另一个字典。这至少可以让你传递包装词典而不是一大堆单独的词典。