gpt4 book ai didi

python - 使用 Python 类作为数据容器

转载 作者:IT老高 更新时间:2023-10-28 20:34:59 27 4
gpt4 key购买 nike

有时将相关数据聚集在一起是有意义的。我倾向于使用字典,例如,

group = dict(a=1, b=2, c=3)
print(group['a'])

我的一个同事喜欢创建一个类

class groupClass:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c

group = groupClass(1, 2, 3)
print(group.a)

请注意,我们没有定义任何类方法。

我喜欢使用字典,因为我喜欢尽量减少代码行数。我的同事认为如果你使用一个类,代码的可读性会更高,而且以后可以更容易地为类添加方法。

你更喜欢哪个,为什么?

最佳答案

背景

R. Hettinger 在 SF Python 的 2017 年假日聚会上介绍了替代的基于属性的数据容器的摘要。见他的tweet和他的slide deck .他还给了一个talk在 PyCon 2018 关于数据类。

article 中提到了其他数据容器类型并且主要在 Python 3 文档中(参见下面的链接)。

这里是关于 python-ideas 的讨论关于将 recordclass 添加到标准库的邮件列表。

选项

标准库中的替代方案

外部选项

  • records : 可变的命名元组(另见 recordclass)
  • bunch : 添加对字典的属性访问(SimpleNamedspace 的灵感;另见 munch (py3))
  • box : 用 dot-style lookup 包装字典功能
  • attrdict : 将映射中的元素作为键或属性访问
  • fields :从容器类中删除样板。
  • namedlist :可变的、类似元组的容器,由 E. Smith 提供默认值
  • attrs : 类似于数据类,包含一些特性(验证、转换器、__slots__ 等)。另见 cattrs 上的文档.
  • misc. :关于制作自己的自定义结构、对象、束、dict 代理等的帖子。

哪一个?

根据具体情况决定使用哪个选项(参见下面的示例)。通常老式的可变字典或不可变的命名元组就足够了。数据类是最新添加的 (Python 3.7a),提供可变性和 optional immutability , promise 减少样板,受 attrs 的启发项目。


示例

import typing as typ
import collections as ct
import dataclasses as dc


# Problem: You want a simple container to hold personal data.
# Solution: Try a NamedTuple.
>>> class Person(typ.NamedTuple):
... name: str
... age: int
>>> a = Person("bob", 30)
>>> a
Person(name='bob', age=30)
# Problem: You need to change age each year, but namedtuples are immutable. 
# Solution: Use assignable attributes of a traditional class.
>>> class Person:
... def __init__(self, name, age):
... self.name = name
... self.age = age
>>> b = Person("bob", 30)
>>> b.age = 31
>>> b
<__main__.Person at 0x4e27128>
# Problem: You lost the pretty repr and want to add comparison features.
# Solution: Use included repr and eq features from the new dataclasses.
>>> @dc.dataclass(eq=True)
... class Person:
... name: str
... age: int
>>> c = Person("bob", 30)
>>> c.age = 31
>>> c
Person(name='bob', age=31)
>>> d = Person("dan", 31)
>>> c != d
True

关于python - 使用 Python 类作为数据容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3357581/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com