在Python中有没有类似C++中结构体的数据类型?

35 投票
8 回答
48896 浏览
提问于 2025-04-16 17:19

在Python里有没有类似于C++中结构体(struct)的数据类型?我喜欢结构体的特性,比如可以用myStruct.someName来访问里面的内容。我知道类(class)也可以做到这一点,但我不想每次需要一个“容器”来存数据的时候都去写一个类。

8 个回答

15

dataclass 从 Python 3.7 开始已经成为内置功能了!

from dataclasses import dataclass

@dataclass
class EZClass:
    name: str='default'
    qty: int

测试:

classy = EZClass('cars', 3)
print(classy)

输出:

EZClass(name='cars', qty=3)

除了自动生成初始化方法和 __repr__ 方法之外,它还会自动创建一个 __eq__ 方法,这样就可以很简单直观地比较两个类的实例。

详细信息请查看 PEP 557

这个功能也可以通过 dataclasses 包 在 Python 3.6 中使用。

17

除了字典类型,Python 还有一种叫做 namedtuple 的类型,它的行为有点像结构体。

MyStruct = namedtuple('MyStruct', ['someName', 'anotherName'])
aStruct = MyStruct('aValue', 'anotherValue')

print aStruct.someName, aStruct.anotherName
37

为什么不呢?类是可以用来做这个的。

如果你想节省一些内存,你可以使用 __slots__,这样对象就不会有 __dict__ 了。想了解更多细节,可以查看这个链接:http://docs.python.org/reference/datamodel.html#slots,还有这个链接 Usage of __slots__?,里面有一些有用的信息。

举个例子,一个只包含两个值(ab)的类可以这样写:

class AB(object):
    __slots__ = ('a', 'b')

如果你实际上想要一个字典,但希望通过 obj.item 来访问,而不是 obj['item'],你可以继承字典类,并实现 __getattr____setattr__,这样它就会像 __getitem____setitem__ 一样工作。

撰写回答