在Python中有没有类似C++中结构体的数据类型?
在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__?,里面有一些有用的信息。
举个例子,一个只包含两个值(a
和 b
)的类可以这样写:
class AB(object):
__slots__ = ('a', 'b')
如果你实际上想要一个字典,但希望通过 obj.item
来访问,而不是 obj['item']
,你可以继承字典类,并实现 __getattr__
和 __setattr__
,这样它就会像 __getitem__
和 __setitem__
一样工作。