Python 里**自定义数据单元**

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 不支持

三、怎么选(直接按场景用)

  1. 临时凑一组数据,不在乎字段名 → 用 tuple

  2. 固定字段、数据不允许修改、追求极简 → 用 namedtuple(你卡牌案例就用它)

  3. 需要改属性、还要写各种方法

    • Python3.7 及以上 → 优先 @dataclass
    • 老旧版本 / 追求兼容 → 手写 普通 class

四、补充两个冷门(了解即可)

  1. 字典 dict 也能当临时数据单元:d = {"点数":"A", "花色":"红桃"}优点灵活,缺点:不是 "单元对象",语法松散,不适合做标准数据结构。
  2. slots 优化类 在普通类上加 __slots__ 减少内存,适合大量创建对象,属于进阶优化。

最简总结

日常自定义数据单元就记 3 主力:

  • 只读、轻量 → namedtuple
  • 可读写、新项目 → dataclass
  • 兼容老环境、复杂逻辑 → 普通 class
相关推荐
开开心心就好4 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
Setsuna_F_Seiei6 小时前
前端转型 Agent 开发 05 之 Agent Hooks 与 Checkpointer(让 Agent 从全自动转变人为可掌控)
前端·agent·ai编程
百万蹄蹄向前冲8 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙8 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan9 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen10 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理10 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
IT_陈寒11 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
Blanche150011 小时前
利用 RAG 为答疑机器人扩展知识范围
前端
天若有情67311 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具