Python 里自定义数据单元 (用来打包一组关联数据,类似结构体)一共就4 种主流写法,从最简单到常用依次讲,附对比、用法、适用场景,全程精简。
一、4 种常用数据单元写法
1. 普通元组 tuple(最原始)
只是把多个值打包,无字段名,只能按下标访问。
python
运行
ini
# 定义/创建
card = ("A", "红桃")
# 取值(只能用索引)
print(card[0]) # A
print(card[1]) # 红桃
特点
- 最简,不用额外导入
- 只读、不可修改
- 缺点:可读性差,记不住下标对应含义适用:临时、简单数据,不用区分字段名。
2. 命名元组 namedtuple(你正在学的)
collections.namedtuple,带字段名的只读元组,项目里高频用。
python
运行
ini
from collections import namedtuple
# 定义数据单元
Card = namedtuple("Card", ["点数", "花色"])
# 创建实例
c = Card("A", "红桃")
# 两种取值:字段名 / 下标
print(c.点数)
print(c[1])
特点
- 一行定义,不用写
__init__ - 只读、安全、支持解包、遍历
- 缺点:属性不能修改 ,没法动态增删字段适用:固定字段、只读结构化数据(卡牌、坐标、日志、简单记录)。
3. 普通自定义类 class(传统写法)
手写 __init__,自由度最高。
python
运行
ruby
class Card:
def __init__(self, 点数, 花色):
self.点数 = 点数
self.花色 = 花色
c = Card("A", "红桃")
print(c.点数)
# 可以修改属性
c.点数 = "K"
特点
- 属性可读写
- 可以随意加方法、逻辑、校验
- 缺点:代码偏多适用:需要修改数据、绑定业务方法、复杂逻辑的单元。
4. 数据类 dataclasses.dataclass(Python3.7+ 主推)
官方标准数据类,兼顾简洁 + 可读写,现在最流行。
python
运行
python
from dataclasses import dataclass
@dataclass
class Card:
点数: str
花色: str
c = Card("A", "红桃")
print(c.点数)
# 支持修改
c.花色 = "黑桃"
特点
- 不用手写
__init__,代码简洁 - 属性可读写,支持类型标注、默认值
- 可自由添加方法适用:绝大多数业务数据单元(现代 Python 项目首选)。
二、四种方式核心对比(一眼分清)
表格
| 写法 | 是否导入 | 能否改属性 | 优点 | 缺点 |
|---|---|---|---|---|
| 普通 tuple | 不用 | ❌ 只读 | 最简单 | 无字段名,可读性差 |
| namedtuple | 需导入 | ❌ 只读 | 简洁、有字段名、轻量 | 不能改属性 |
| 普通 class | 不用 | ✅ 可读写 | 完全自由、可加方法 | 代码繁琐 |
| @dataclass | 需导入 | ✅ 可读写 | 简洁 + 灵活,官方推荐 | 低版本 Python 不支持 |
三、怎么选(直接按场景用)
-
临时凑一组数据,不在乎字段名 → 用 tuple
-
固定字段、数据不允许修改、追求极简 → 用 namedtuple(你卡牌案例就用它)
-
需要改属性、还要写各种方法
- Python3.7 及以上 → 优先 @dataclass
- 老旧版本 / 追求兼容 → 手写 普通 class
四、补充两个冷门(了解即可)
- 字典 dict 也能当临时数据单元:
d = {"点数":"A", "花色":"红桃"}优点灵活,缺点:不是 "单元对象",语法松散,不适合做标准数据结构。 - slots 优化类 在普通类上加
__slots__减少内存,适合大量创建对象,属于进阶优化。
最简总结
日常自定义数据单元就记 3 主力:
- 只读、轻量 → namedtuple
- 可读写、新项目 → dataclass
- 兼容老环境、复杂逻辑 → 普通 class