现在,我有很多python文件。每一个都有很多功能。
我到处都在传递散列映射。基本字典,以单词作为关键字,分数作为值。
{ 'dog': 33, 'cat': 294 }
我还做了一些更复杂的结构,比如:
{ 'dog': [ 33, 66, 11, 88 ], 'cat': [11, 66, 22] }
我需要把这些东西变成我自己的“对象”吗?如果是这样,它们会是什么呢?我不太做面向对象的编程,所以我问一些新手的问题。
发布于 2011-07-17 06:30:25
多年来,我一直维护着大量的代码库,这些代码库更偏爱原始字典而不是对象,我的观点是,如果这个代码库将由A)另一个人或B)几个人维护,您应该开始迁移到真正的类和OOP。首先,通过查看源代码甚至交互地使用dir()
和其他自检技术,您可以很容易地看到一个类实例应该具有哪些属性,这使得您的代码更易于学习、修改和维护。对于具有直观名称、定义良好的属性、文档和可读源代码的类,理解和调试要容易得多,而不是一大堆函数,这些函数将字典作为参数,并在运行时以各种方式转换它们,只有阅读整个代码库才能理解。当涉及到类时,Tracebacks通常也更容易阅读和破译,因为您不会得到通用的低级错误消息。
作为进一步的证据,去看看成熟和成功的python项目。您将看到许多OOP、类和文档。原始字典、列表、集合和元组在适当的时候(您的数据确实很简单)和小型项目和脚本都很好,但可维护性不会超过一定的项目大小。"X只是一个字典“的概念只有在你对X的概念极其简单的情况下才能存在。
发布于 2011-07-17 06:12:53
根据你到底在做什么,namedTuple可能是你的问题的最佳解决方案。没有足够的信息可以确定。
发布于 2011-07-17 06:56:41
我的经验法则是,如果你有作用于字典的函数,那么它可能应该是一个类,而那些函数应该是方法。
作为一名(主要是前任)-perl程序员,传递上述风格是非常熟悉的。然而,Python面向对象工具要轻量级得多,值得尽早部署。
例如
{ '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
https://stackoverflow.com/questions/6720440
复制相似问题