好的,这里有严肃的noob问题,所以我正在寻找一个非常一般的答案。我是Python的新手,语言看起来很简单,但是当我遇到问题时,我遇到了问题。来自静态类型语言,我的第一直觉是创建一些对象,这样我就可以传递相关数据桶,同时保持我的逻辑简洁。
但这是Python中的一件事吗?由于语言是动态类型的,因此在使对象传递时有什么意义吗?如果我可以动态设置字段,为什么还要提前定义字段?如果我没有田地,为什么我会打扰一个物体呢?我不能使用字典,它基本相同吗?
所以我想我问,如果我需要将我的数据访问代码与我的逻辑分开,那么属性桶是个好主意吗?或者人们不是在Python中这样做而只是使用字典?
编辑:
这是我想要完成的基本想法:
我有一个http api,它返回一个json字符串。我想用urllib2命中该url,将其作为字符串返回,并使用json.loads将其转换为dict对象。然后我想将mysql代码分成另一个类。显然我不想传递20个值,因为我已经有了所有值的dict,创建动态对象并从dict中添加每个值会有什么好处?我还是要知道数据访问类中的所有名称吗?我不是在谈论性能,而是在谈论设计。
答案 0 :(得分:4)
如果你想要传递数据,我不知道你的具体要求,我会说词典可能更好。它们是内置的,它快速,简单,每个程序员都能理解它们,与价值对象相比,开发人员必须查找特定的属性。
示例:
在这方面也很相关:Jack Diederich的Stop writing classes(YT):
课程很棒,但也过度使用。本演讲将描述从现实世界代码中获取的类过度使用的示例,并重构其中不必要的类,异常和模块。
答案 1 :(得分:2)
对于只读数据,named tuple是一个不错的选择,您可以按字段名称访问值,并且它比字典更具内存效率。在我看来,传递的数据应该是只读的。
编辑:对于您的用例,我认为您应该将字典传递给管道。创建一个仅用于数据存储的类并且不提供其他服务只会进一步使代码复杂化而几乎没有什么好处。
答案 2 :(得分:0)
你实际上找到了很多。如果代码是“严格的Python”,那么人们往往不会制作POPO类型或DTO类型的对象。人们倾向于传递他们需要的数据。但是,如果您正在与其他服务进行通信,则通信管道可能会生成您必须处理的较重类型的对象(例如,Suds将服务中的数据类型与Python对象进行非常接近的映射)。 / p>
幸运的是(或者不是),你可以“充分利用这两个世界”。你可能会看到类似下面的“泛型DTO”(不一定是好,但是pythonic):
class Person:
def __init__(self, *args, **kwargs):
self.__dict__ = kwargs
因此虽然没有为它们设置surname
或givenName
类型属性,但您可以只为它的语法糖添加它们。 (如果您正在进行列表理解,则非常有用):
last_names = [x.surname for x in people]
答案 3 :(得分:0)
除非我想要一个通用的键值数据类型,否则我不会使用字典,因为我不知道键是什么。对于所有使用C ++或类似对象的情况,您可以并且应该使用Python中的对象。
原因是尽管您可以使用dict
,但它不提供封装或抽象。即使是来自静态类型的语言,您也应该了解它的好处。您无法使dict
验证其值。没有方便的地方来记录dict
的结构,或命名该结构。
有趣的是,Python对象的属性是字典。看看这个:
>>> class Foo(object):
... def __init__(self):
... self.cat = 'meow'
... self.dot = 'woof'
...
>>> f = Foo()
>>> f.__dict__
{'dot': 'woof', 'cat': 'meow'}
而且,您可以使课程看起来像dict
:
>>> class Animals(object):
... def __getitem__(self, key):
... if key == 'cat':
... return 'meow'
... if key == 'dog':
... return 'woof'
... raise KeyError(key)
...
>>> a = Animals()
>>> a['cat']
'meow'
>>> a['dog']
'woof'