Python中与Ada记录/C++结构体对应的类型是什么?

4 投票
2 回答
1077 浏览
提问于 2025-04-16 19:13

假设我在记录一些数据,并且想把这些数据元素关联起来,让每一组记录的数据总是有固定的组成,也就是说没有缺失的字段。

我大部分的编程经验都是在Ada或C/C++这类语言中。在Ada中,我会使用记录类型和聚合赋值,这样当记录类型更新了新字段时,使用这个记录的人会被编译器提醒。在C++中,我可能会使用存储类和构造函数来做类似的事情。

在Python中,处理类似情况的合适方法是什么呢?这是一个使用类的好机会,还是有更简单的方式可以替代Ada的记录呢?

还有一个想法,Ada的记录和C++的构造函数都允许使用默认初始化值。有没有Python的解决方案可以同时满足上述问题,并提供这个功能呢?

2 个回答

3

在Python中,字典是处理这种情况的经典方法。不过,字典不能强制要求某个值必须存在,也不能设置初始值。

config = {'maxusers': 20, 'port': 2345, 'quota': 20480000}

collections.namedtuple() 是在支持的Python版本中另一个可选的方法。

5

你可以考虑使用namedtuple(来自collections库)。它其实就是一种元组,但你可以通过名字来引用字段,而不仅仅是通过位置。所以,它是一个有固定结构的、有序的命名字段集合。它的优点是比较轻量,因为它用slots来定义字段名,这样就不需要在每个实例中都携带一个字典。

一个典型的用法是定义一个点:

from collections import namedtuple
Point = namedtuple("Point", "x y")
p1 = Point(x=11, y=22)

它的主要缺点是,作为元组,它是不可变的。这意味着一旦创建,就不能改变。不过,有一个方法叫replace,可以让你用新值替换一个或多个字段,但这个过程会创建一个新的实例。

另外,还有一个可变版本的namedtuple,叫做records,可以直接修改字段。我用过这个,觉得效果很好。

撰写回答